@ViewBag.Title

Интеграция AJAX в ASP.NET MVC 4

Наверное, уже не существует веб разработчика, который не слышал о Ajax. Microsoft в такой ситуации не может оставаться в стороне, с каждым релизом старается облегчить жизнь именно нам, ASP.NET MVC разработчикам. Но прежде чем я продолжу статью, немного отступлюсь от темы.

Когда я познакомился с MVC фреймворком, он был тогда только во второй версии и, столкнувшись с такими хелперами как @Ajax. , честно говоря, их реализация на стороне клиента меня не впечатлила. Нет, так нет, подумал я про себя, у меня есть jQuery со своим $.ajax , мне его за глаза. Вот и забыл я про них на несколько лет, к своему великому сожалению проморгав этот момент с третьим релизом. Что было, то было. Благо что взялся за ум и почитал две книги по MVC 4. Далее расскажу, как можно сократить написание строк кода благодаря хелперам, упомянутым мною выше.

Начну с того, что MVC может работать с двумя вариантами Ajax библиотек (конечно я же имею ввиду с коробки, не более того) — jQuery и Microsoft Ajax. Чтобы знать, для какого адаптера создавать разметку, существует настройка в web.config UnobtrusiveJavaScriptEnabled и соответствующее значение true (для работы с jQuery) и f alse (для работы с Microsoft Ajax). Если же нам необходимо поменять значение только для одного представления, можно воспользоваться методом — @ . Хочу обратить внимание, что данная настройка влияет и на формирование валидационных данных на стороне клиента.

Читайте также:  Pop up menu and html

В зависимости от того, каков вариант вам более по душе, вам необходимо подключить соответствующий адаптер. Для Microsoft Ajax

Как я писал выше, вариант с jQuery меня вполне устраивает. Поэтому пойду по пути ненавязчивого JavaScript (т.е. web.config с/> ), и начну с самого простого.

Рассмотрим такую задачу. Есть ссылочка, при клике на которую мы хотим обновить содержимое контейнера. Что делал я ранее.

public ActionResult Index()
  
@Html.Partial("_IndexPartial")
@Html.ActionLink("Поменять данные", "Index", "Home", new <>, new )

_IndexPartial частичное представление

Динамическое данные в зависимости от запроса

Большинству знаком такой вспомогательный метод как Html. ActionLink(. ) , представленный выше. Казалось бы, строк кода в принципе не много, да и привык так уже программировать, так что все в порядке, но ведь я очень ленивый программист и в меру своих сил борюсь за чистоту и уменьшение кода. Поэтому мне будет приятно уменьшить представление с 22 строк до 5. И на помощь ко мне приходит Ajax.ActionLink(. ) (конечно, скептики могут сказать, что вместо $.ajax можно было использовать .load или $.get , но сути это не меняет, мы сократили представление, которое и так порой у нас начинает пухнуть)

 
@Html.Partial("_IndexPartial")
@Ajax.ActionLink("Поменять данные", "Index", "Home", new <>, new AjaxOptions, new ) //id элемента нам уже не нужно, но для наглядности оставлю

Разница между двумя расширенными методами Html.ActionLink и Ajax.ActionLink заключается только в одном параметре, объекте AjaxOptions . Давайте о нем и поговорим.

AjaxOptions

Как видно свойств, в принципе, у него не много, с другой стороны это и хорошо, когда начинают создавать серебряную пулю, будь то объект или библиотека, становится просто не вероятно громоздкой и неработоспособной.

Что из свойств за что отвечает, лучше MSDN я сказать не смогу.

Давайте пробежимся по свойствам:

Confirm — аналог javascript confirm(. )

HttpMethod — типа string , самое интересное, что же MS заставило ограничиться только 2 методами, ума не приложу почему, и видимо алгоритм таков, все что не GET , null или пустая строка после .Trim() — все POST

InsertionMode — перечисление со значениями » InsertAfter » (вставить в конец контейнера), » InsertBefore » (вставить в начало контейнера) или » Replace » (заменить содержимое контейнера)

Loading. — изначальный скрытый элемент

  • OnBegin — beforeSend
  • OnComplete — complete
  • OnFailure — error
  • OnSuccess — success

Ajax вспомогательные методы

Под конец хотелось бы привести табличку методов, которые нам время от времени облегчат нашу жизнь

Ajax.ActionLink Создает гиперссылку на действие контроллера, которая при нажатии отправляет запрос Ajax.
Ajax.RouteLink Похож на Ajax.ActionLink , но создает ссылку на определенный роут, а не действие контроллера
Ajax.BeginForm Создает элемент формы, который будет отправлять введенные данные к определенному действию контроллера
Ajax.BeginRouteForm Похож на Ajax.BeginForm , но отправляет запрос по определенному роуту, а не к действию контроллера
Ajax.GlobalizationScript Создает ссылку на скрипт глобализации, в котором содержится информация о языке и региональных параметрах
Ajax.JavaScriptStringEncode Кодирует строку для безопасного использования в JavaScript

Обеспечение постепенного ухудшения

Рассмотрим такую ситуацию. Ajax запрос возвращает JSON/XML/Частичное представление — и все хорошо, но такой подход совсем не приемлем, если пользователь отключил JavaScript, либо браузер вообще не поддерживает его. В таких случаях необходимо полностью вернуть страницу пользователю. Одним из решений является вариант использования «разводки» в одном методе действия с определением того, является ли этот запрос запросом Ajax. Это можно сделать, используя Request.IsAjaxRequest() , как было рассмотрено выше.

Вторым вариантом решения проблемы является создание двух разных методов действия: одного — для Ajax запроса, а второго — для обычного. Давайте рассмотрим этот вариант подробнее, на упрощенной задаче сохранения полученного от пользователя комментария.

Создаем два метода действия

[HttpPost] public ActionResult AddComment(string comment) < //необходимые действия return View(); >[HttpPost] public ActionResult AddCommentAjax(string comment) < //необходимые действия return Json(new ); > 

Ваш комментарий добавлен успешно!

и наше представление с формой

 function OnSuccessComment(data) @using (Ajax.BeginForm("AddComment", new AjaxOptions < Url = Url.Action("AddCommentAjax"), OnSuccess = "OnSuccessComment", HttpMethod = "POST" >)) < @Html.TextArea("comment") > 
Как это работает

Для браузера рендерится следующая форма

Мы видим, что отличие от @using (Html.BeginForm(«AddComment», «Home»)) заключается только в дополнительных data- атрибутах. Иными словами, для отключенного Javascript форма будет отравляться на public ActionResult AddComment(string comment) . Когда же JavaScript включен, адаптер считывает данные с data- атрибутов, перехватывает отправку формы и делает запрос на public ActionResult AddCommentAjax(string comment) . Успешный результат мы получаем в виде переданного JSON и обрабатываем в указанной js функции OnSuccessComment .

Резюме

Целью моей статьи было лишь показать, что некоторые вещи можно немного ускорить и не изобретать велосипед (сужу лишь по себе).

Источник

JavaScript и AJAX

Современные веб-приложения практически невозможно представить без языка клиентской части — JavaScript. Даже при использовании таких серверных языков и технологий, как PHP, ASP.NET, трудно обойтись без JavaScript. Однако чистый JavaScript в реальности используется все меньше. Ему на смену приходят специальные библиотеки, в частности, jQuery. Применительно к ASP.NET MVC при создании веб-приложений библиотеки jQuery играют очень большую роль.

Подключение файлов JavaScript/jQuery

По умолчанию проект ASP.NET MVC 5 уже содержит необходимый базовый набор скриптов, в том числе библиотеки jQuery:

Библиотеки javascript в ASP.NET MVC 5

Большинство скриптов по умолчанию имеют свои двойники с суффиксом min , например, jquery-1.10.2.js и jquery-1.10.2.min.js . Оба скрипта представляют одну и ту же функциональность. Но вторая версия представляет минимизированную версию (поэтому и идет с суффиксом min ). Подобные минимизированные скрипты гораздо меньше по объему (в среднем на 60%), поэтому в реальным приложениях предпочтительнее использовать именно минимизированные скрипты, так как пользователь тратит меньше времени и трафика на их загрузку. В то же время их не очень удобно читать. Поэтому для большего удобства разработчиков полные и минимизированные скрипты базовых библиотек идут вместе.

Вкратце посмотрим, зачем нужны большинство скриптов, идущих по умолчанию в проекте MVC 5 с типом аутентификации Individual User Accounts:

  • jquery-1.10.2.js — базовая библиотека jQuery, на которую опираются большинство других скриптов. В данном случае используется версия 1.10.2. Однако библиотека постоянно обновляется, поэтому можно использовать более новые версии, которые можно добавить вручную или через NuGet.
  • modernizr-2.6.2.js — библиотека, позволяющая определить, поддерживает ли браузер те или иные возможности HTML5 и CSS3
  • bootstrap.js — библиотека, позволяющая создавать адаптивные веб-приложения с использованием css-фреймворка bootstrap
  • respond.js — позволяет использовать правила media queries CSS3 в старых браузерах, которые напрямую не поддерживают данную возможность
  • jquery.validate.js — представляет функционал для валидации на стороне клиента
  • jquery.validate.unobtrusive.js — предоставляет поддержку ненавязчивой валидации модели
  • jquery-1.10.2.intellisense.js и jquery.validate-vsdoc.js — используются для поддержки документации и IntelliSense по соответствующим библиотекам в Visual Studio

В некоторых типах проектов ряд распространенных скриптов может отсутствовать, например, если делать проект MVC 5 с типом аутентификации No Athentication, то в нем будет отсутствовать скрипты валидации. В этом случае мы можем найти недостающий скрипт в NuGet и добавить его в проект:

Чтобы подключить файл javascript используется метод Render класса System.Web.Optimization.Scripts :

Этот метод принимает в качестве параметра строку — полный путь к скрипту.

Также для подключения скриптов мы можем использовать хелпер Url.Content :

Если файлы javascript будут использоваться большинством представлений приложения, то удобнее всего добавить их сразу на мастер-страницу.

      @Styles.Render("~/Content/css") @Scripts.Render("~/scripts/jquery-1.10.2.min.js") @Scripts.Render("~/scripts/validate.min.js") @RenderBody() @RenderSection("scripts", required: false)  

Если же скрипты используются не на всех, а на отдельных предствлениях, то удобно определить в мастер-странице специальную секцию для скрипов, как в примере выше. А затем в представлении подключать скрипты в этой секции:

Источник

Asp net javascript ajax

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

AJAX (Асинхронный JavaScript и XML) представляет собой технологию гибкого взаимодействия между клиентом и сервером. Благодаря ее использованию мы можем осуществлять асинхронные запросы к серверу без перезагрузки всей страницы. Правда, в настоящее время все больше вместо формата XML используется формат JSON для взаимодействия между клиентом и сервером.

Применительно к ASP.NET MVC использование AJAX вылилось в целую концепцию под названием «ненавязчивого AJAX» и ненавязчивого JavaScript ( unobtrusive Ajax/JavaScript ). Смысл этой концепции заключается в том, что весь необходимый код JavaScript используется не на самой веб-странице, а помещается в отдельные файлы с расширением *.js . А затем с помощью тега мы в веб-станице ссылаемся на данный файл кода.

Таким образом мы отделяем визуализацию от логики приложения. Что имеет свои плюсы. Так, выделение скрипта в отдельный загружаемый файл увеличивает производительность сайта, поскольку файл сохраняется в кэше и затем от туда подгружается.

Настройка ненавязчивого JavaScript/ AJAX

Во-первых, соответствующие настройки должны быть указаны в файле Web.config:

Во-вторых, нам надо подключить соответствующие файлы JavaScript:

@Scripts.Render("~/scripts/jquery-1.10.2.js") @Scripts.Render("~/scripts/jquery.unobtrusive-ajax.js")

Если у нас в проекте отсуствует библиотека jquery.unobtrusive-ajax.js, то мы ее опять же можем добавить через NuGet:

Первый файл — общая библиотека jQuery. Второй файл ( jquery.unobtrusive-ajax.js ) подключает к приложению функциональность Ajax-хелперов, например, Ajax-форм. Главное не забыть, подключить основную библиотеку jQuery перед остальными файлами, так как все остальные скрипты, как правило, зависят от нее.

AJAX-хелперы

Для осуществления ajax-запросов в ASP.NET MVC присутствует такая функциональность, как ajax-хелперы:

Наиболее часто используются Ajax.ActionLink и Ajax.BeginForm , поэтому далее мы рассмотрим эти хелперы.

Источник

Оцените статью