ASP.NET MVC 2.0 JsonRequestBehavior Глобальная настройка
Теперь ASP.NET MVC 2.0 по умолчанию генерирует исключение, когда действие пытается вернуть JSON в ответ на запрос GET. Я знаю, что это можно переопределить методом методом методом JsonRequestBehavior.AllowGet, но можно ли установить его на контроллер или более высокий уровень (возможно, web.config)?
Обновление: по словам Леви, это то, что я использовал -
protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding)
{
return Json(data, contentType, JsonRequestBehavior.AllowGet);
}
Ответы
Ответ 1
Это, как и другие параметры, зависящие от MVC, не настраивается через Web.config. Но у вас есть два варианта:
-
Переопределите перегрузку Controller.Json(объект, строка, кодирование) для вызова Json (объект, строка, кодировка, JsonRequestBehavior), передавая JsonRequestBehavior.AllowGet в качестве последнего аргумента. Если вы хотите, чтобы это применимо ко всем контроллерам, сделайте это в абстрактном классе базового контроллера, а затем включите все подклассы ваших контроллеров в абстрактный класс.
-
Сделайте метод расширения MyJson (этот контроллер,...), который создает JsonResult и устанавливает соответствующие свойства, а затем вызывает его с вашего контроллера через this.MyJson(...).
Ответ 2
Есть еще один вариант. Используйте Action Filters.
Создайте новый ActionFilterAttribute, примените его к контроллеру или конкретному действию (в зависимости от ваших потребностей). Этого должно быть достаточно:
public class JsonRequestBehaviorAttribute : ActionFilterAttribute
{
private JsonRequestBehavior Behavior { get; set; }
public JsonRequestBehaviorAttribute()
{
Behavior = JsonRequestBehavior.AllowGet;
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var result = filterContext.Result as JsonResult;
if (result != null)
{
result.JsonRequestBehavior = Behavior;
}
}
}
Затем примените его следующим образом:
[JsonRequestBehavior]
public class Upload2Controller : Controller
Ответ 3
MVC 2 блокирует Json для запросов GET по соображениям безопасности. Если вы хотите переопределить это поведение, проверьте перегрузку для Json, которая принимает параметр JsonRequestBehavior.
public ActionResult Index()
{
return Json(data, JsonRequestBehavior.AllowGet)
}
Ответ 4
Я также получил эту ошибку, когда впервые использовал MVC 2.0, используя мой старый код в MVC 1.0. Я использую скрипач, чтобы определить причину ошибки. См. Инструкции по устранению неполадок с помощью Fidder -
http://www.rodcerrada.com/post/2011/07/11/jQuery-getJSON()-does-not-tirgger-the-callback-in-ASPNET-MVC-2.aspx
Ответ 5
Это проблема безопасности, с которой сталкивался MVC2?
http://haacked.com/archive/2009/06/25/json-hijacking.aspx
Если это так, похоже, что уязвимость - это только проблема, если вы пытаетесь выполнить вызов json на внешний веб-сайт. Если ваше приложение MVC2 только делает json-вызовы на ваш собственный сайт (например, для заполнения jqgrids), разве вы не сможете безопасно переопределить Json-вызов в вашем базовом контроллере, чтобы всегда разрешать получать?
Ответ 6
Просто измените код JSON на:
$.getJson("methodname/" + ID, null, function (data, textStatus)
в
$.post("methodname/" + ID, null, function (data, textStatus)