ASP.NET MVC 2.0 JsonRequestBehavior Global Setting - PullRequest
39 голосов
/ 02 ноября 2009

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

Ответы [ 6 ]

26 голосов
/ 03 ноября 2009

Это, как и другие специфичные для MVC настройки, не настраивается через Web.config. Но у вас есть два варианта:

  1. Переопределить перегрузку Controller.Json (объект, строка, кодировка) для вызова Json (объект, строка, кодировка, JsonRequestBehavior), передав JsonRequestBehavior.AllowGet в качестве последнего аргумента. Если вы хотите, чтобы это применялось ко всем контроллерам, то сделайте это внутри абстрактного базового класса контроллеров, а затем сделайте так, чтобы все ваши подклассы контроллеров содержали этот абстрактный класс.

  2. Создайте метод расширения MyJson (этот контроллер, ...), который создает JsonResult и задает соответствующие свойства, а затем вызывает его из вашего контроллера через this.MyJson (...).

24 голосов
/ 01 января 2011

Есть еще один вариант. Используйте фильтры действий.

Создайте новый 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 голосов
/ 20 апреля 2010

MVC 2 блок Json для запросов GET по соображениям безопасности. Если вы хотите изменить это поведение, проверьте перегрузку для Json, которая принимает параметр JsonRequestBehavior.

public ActionResult Index()

{

   return Json(data, JsonRequestBehavior.AllowGet)

}
1 голос
/ 11 июля 2011

Я также получил эту ошибку, когда я впервые использую MVC 2.0, используя мой старый код в MVC 1.0. Я использую Fiddler, чтобы определить причину ошибки. Смотрите шаги по устранению неполадок с помощью Fidder -

http://www.rodcerrada.com/post/2011/07/11/jQuery-getJSON()-does-not-tirgger-the-callback-in-ASPNET-MVC-2.aspx

0 голосов
/ 03 декабря 2013

Просто измените код JSON с:

$.getJson("methodname/" + ID, null, function (data, textStatus)

до:

$.post("methodname/" + ID, null, function (data, textStatus)
0 голосов
/ 22 ноября 2010

Это проблема безопасности, которую MVC2 пытался решить? http://haacked.com/archive/2009/06/25/json-hijacking.aspx

Если это так, то кажется, что уязвимость является проблемой, только если вы пытаетесь сделать json-вызов на внешний сайт. Если ваше приложение MVC2 только выполняет вызовы json на ваш собственный веб-сайт (например, для заполнения jqgrids), разве вы не можете безопасно переопределить вызов Json на вашем базовом контроллере, чтобы всегда разрешать get?

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