Подтвердить что ты не робот

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);
}
4b9b3361

Ответ 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)

}

Ответ 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)