ASP.NET MVC 2.0 JsonRequestBehavior全局设置

bec*_*lmw 39 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);
}
Run Code Online (Sandbox Code Playgroud)

Lev*_*evi 26

与其他MVC特定的设置一样,这不能通过Web.config设置.但是你有两个选择:

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

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


Dav*_*nde 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样应用:

[JsonRequestBehavior]
public class Upload2Controller : Controller
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望在任何地方应用此功能,可以在MVC 3及更高版本中使用全局操作过滤器. (2认同)