39

默认情况下,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);
}
4

6 回答 6

27

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

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

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

于 2009-11-03T08:52:19.377 回答
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
于 2011-01-01T15:05:46.210 回答
3

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

public ActionResult Index()

{

   return Json(data, JsonRequestBehavior.AllowGet)

}
于 2010-04-20T14:36:41.770 回答
1

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

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

于 2011-07-11T12:06:41.123 回答
0

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

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

于 2010-11-22T16:25:42.110 回答
0

只需从以下位置更改 JSON 代码:

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

到:

$.post("methodname/" + ID, null, function (data, textStatus)
于 2013-12-03T16:51:22.507 回答