ASP.NET MVC 2.0 JsonRequestBehavior全局设置

时间:2009-11-02 19:37:48

标签: asp.net asp.net-mvc-2

ASP.NET MVC 2.0现在默认情况下会在操作尝试返回JSON以响应GET请求时抛出异常。我知道这可以通过使用JsonRequestBehavior.AllowGet逐个方法覆盖,但是可以在控制器或更高的基础上设置(可能是web.config)吗?

更新:Per Levi的评论,这是我最终使用的 -

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding)
{
    return Json(data, contentType, JsonRequestBehavior.AllowGet);
}

6 个答案:

答案 0 :(得分:26)

这与其他MVC特定设置一样,无法通过Web.config进行设置。但是你有两个选择:

  1. 重写Controller.Json(object,string,Encoding)重载以调用Json(object,string,Encoding,JsonRequestBehavior),并将 JsonRequestBehavior.AllowGet 作为最后一个参数传递。如果您希望将其应用于所有控制器,则在抽象基本控制器类中执行此操作,然后让所有控制器为该抽象类创建子类。

  2. 创建一个扩展方法MyJson(this Controller,...),它创建一个JsonResult并设置相应的属性,然后通过this.MyJson(...)从控制器中调用它。

    < / LI>

答案 1 :(得分:24)

还有另一种选择。使用动作过滤器。

创建一个新的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

答案 2 :(得分:3)

MVC 2出于安全原因阻止Json进行GET请求。如果要覆盖该行为,请检查接受JsonRequestBehavior参数的Json的重载。

public ActionResult Index()

{

   return Json(data, JsonRequestBehavior.AllowGet)

}

答案 3 :(得分:1)

当我第一次使用MVC 1.0中的旧代码使用MVC 2.0时,我也遇到了这个错误。我使用fiddler来确定错误的原因。请参阅有关如何使用Fidder进行故障排除的步骤 -

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

答案 4 :(得分:0)

这是MVC2试图解决的安全问题吗? http://haacked.com/archive/2009/06/25/json-hijacking.aspx

如果是这样,如果您尝试对外部网站进行json调用,则漏洞似乎只是一个问题。如果您的MVC2应用程序仅对您自己的网站进行json调用(例如填充jqgrids),您是否应该能够安全地覆盖基本控制器中的Json调用以始终允许get?

答案 5 :(得分:0)

只需更改JSON代码:

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

为:

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