ASP.NET MVC, JSON и не JavaScript клиенты - PullRequest
4 голосов
/ 26 ноября 2008

Мне нужно убедиться, что разрабатываемое мной приложение доступно, а также работает с отключенным JavaScript. Мне просто нужен указатель, чтобы помочь со следующим.

У меня было 3 «цепочки» блоков выбора, и я хотел, чтобы клиенты с поддержкой JavaScript имели хороший опыт Ajax. Я могу легко написать необходимую функциональность, чтобы заполнить связанные блоки в событии изменения предыдущего выбора, используя jQuery и JSON со службой WCF. Однако как насчет клиента без JavaScript?

Могу ли я обернуть отправку рядом с выбором и поместить их в собственную форму, чтобы отправить обратно с определенным действием или другим параметром квестринга? Может ли тот же контроллер дать мне частичный ответ JSON, а также передать полный HTML-ответ. Может кто-нибудь указать мне хорошую демонстрацию, которая использует как JSON, так и обычные сообщения HTTP для получения одинакового результата в ASP.NET MVC. Все демонстрационные примеры ASP.NET MVC, которые я вижу, забывают о клиенте без поддержки JavaScript.

Обновление

Но разве это не так для вызовов Ajax, использующих клиентскую библиотеку Microsoft Ajax, если я читаю ее строго - чего я хочу избежать и использую только jQuery - извинения должны были упомянуть об этом.

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

Жаль, что нет атрибута, который я мог бы использовать на контроллере, например, с [AcceptVerbs (HttpVerbs.Post)], но для типов контента, например, [AcceptType (httpTypes.Json)].

Должен быть лучший способ, чем использовать этот оператор if везде .....

Ответы [ 3 ]

3 голосов
/ 26 ноября 2008

Вы можете проверить свойство IsMvcAjaxRequest и использовать его внутри своего контроллера, а затем вернуть частичное представление (пользовательский элемент управления) или результат JSON, если оно истинно, или полное представление, если оно ложно.

Примерно так:

public ActionResult List()
{
   if (!Request.IsMvcAjaxRequest())
   {
       // Non AJAX requests see the entire ViewPage.
       return View();
   }
   else
   {
       // AJAX requests just get a trimmed down UserControl.
       return Json(...);
   }
 } 

Подробнее здесь: Сайты MVC AJAX, которые изящно деградируют

2 голосов
/ 06 декабря 2008

Эта статья имеет элегантное решение для вашей проблемы: http://devlicio.us/blogs/sergio_pereira/archive/2008/12/05/reusing-views-in-asp-net-mvc-for-ajax-updates.aspx

1 голос
/ 29 ноября 2008

(см. Ваш предыдущий ответ): вы можете передать значение в своей форме Request.Form, чтобы указать, что это браузер с включенным JavaScript или без него, а затем создать фабрику контроллеров, которая будет создавать соответствующий контроллер в соответствии с тем, что вы получить в Request.Form; контроллер по умолчанию для обычных запросов (браузеры с включенным javascript) и «контроллер возврата», который вместо этого возвращает только полные представления. Я не уверен, лучше ли иметь вдвое большее количество контроллеров, чем эти операторы if-else для одного контроллера, но я полагаю, что это вопрос личных предпочтений.

Я Бьюсь об заклад Есть более простые решения, хотя ... Я хотел бы, чтобы этот вопрос был более открытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...