Вопрос

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);
}
Это было полезно?

Решение

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

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

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

Другие советы

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

Создайте новый атрибут 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

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

public ActionResult Index()

{

   return Json(data, JsonRequestBehavior.AllowGet)

}

Я также получил эту ошибку, когда впервые использовал 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

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

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

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

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

к:

$.post("methodname/" + ID, null, function (data, textStatus)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top