Можно ли использовать JSON.NET в качестве сериализатора JSON по умолчанию в ASP.NET MVC 3?
Согласно моим исследованиям, кажется, что единственный способ добиться этого - расширить ActionResult, поскольку JsonResult в MVC3 не является виртуальным ...
Я надеялся, что в ASP.NET MVC 3 появится способ указать подключаемый поставщик для сериализации в JSON.
Мысли?
asp.net-mvc-3
json.net
jsonresult
zam6ak
источник
источник
Ответы:
Я считаю, что лучший способ сделать это - как описано в ваших ссылках - напрямую расширить ActionResult или JsonResult.
Что касается метода JsonResult, который не является виртуальным на контроллере, это неверно, просто выберите правильную перегрузку. Это хорошо работает:
РЕДАКТИРОВАТЬ 1 : расширение JsonResult ...
РЕДАКТИРОВАТЬ 2 : Я удалил проверку на отсутствие данных в соответствии с предложениями ниже. Это должно сделать более новые версии JQuery счастливыми и кажется разумным решением, поскольку ответ может быть безоговорочно десериализован. Однако имейте в виду, что это не поведение по умолчанию для ответов JSON от ASP.NET MVC, которое скорее отвечает пустой строкой, когда данных нет.
источник
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
? Я думаю, что нужно добавить эту проверку в ответ (без внутреннего,MvcResources.JsonRequest_GetNotAllowed
но с некоторым настраиваемым сообщением) Кроме того, как насчет двух других проверок asp.net mvc по умолчанию - MaxJsonLength и RecursionLimit? Нужны ли они нам, если мы используем json.net?Я реализовал это без необходимости в базовом контроллере или инъекции.
Я использовал фильтры действий, чтобы заменить JsonResult на JsonNetResult.
В Global.asax.cs Application_Start () вам нужно будет добавить:
Для завершения, вот мой класс расширения JsonNetResult, который я взял откуда-то еще и немного изменил, чтобы получить правильную поддержку обработки паром:
источник
return Json()
в использовании эффекта Json.Net.JsonResult
изJson()
и конвертирует его вJsonNetResult
. Это делается с помощьюas
ключевого слова, которое возвращает null, если преобразование невозможно. Очень здорово. 10 очков Гриффиндору![BetterJsonHandler]
:-).Используйте конвертер JSON Newtonsoft:
источник
Я знаю, что это хорошо после того, как на вопрос был дан ответ, но я использую другой подход, поскольку использую внедрение зависимостей для создания экземпляров своих контроллеров.
Я заменил IActionInvoker (путем внедрения свойства ControllerActionInvoker) версией, которая переопределяет метод InvokeActionMethod.
Это означает отсутствие изменений в наследовании контроллеров, и его можно легко удалить при обновлении до MVC4, изменив регистрацию контейнера DI для ВСЕХ контроллеров.
--- РЕДАКТИРОВАТЬ - Обновлено, чтобы показать регистрацию контейнера для контроллеров. Я использую здесь Unity.
источник
Расширяя ответ от https://stackoverflow.com/users/183056/sami-beyoglu , если вы установите тип содержимого, тогда jQuery сможет преобразовать возвращенные данные в объект для вас.
источник
JObject jo = GetJSON(); return Content(jo.ToString(), "application/json");
Мой пост может кому-то помочь.
источник
BaseController
, и это было наименьшее влияние на изменение - просто нужно было добавить класс и обновитьBaseController
.Я сделал версию, которая делает действия веб-сервисов типобезопасными и простыми. Вы используете это так:
Класс:
источник