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

更新:根据李维的评论,这就是我最终使用的-

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

解决方案

这样,像其他视特定的的设置,是不是可通过网。config。但你有两个选择:

  1. 复盖控制器。Json(对象、串编码)载叫Json(对象、串编码,JsonRequestBehavior),通过 JsonRequestBehavior.AllowGet 作为最后的论点。如果你想这适用于所有的控制,那么这里面的一个抽象的基本控制器类,然后有你的控制器的子类抽象的类。

  2. 做一个扩展方法MyJson(这个控制器,...)创造一个JsonResult并设置适当的性质,然后称它从你的控制器通过这个。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请求。如果你想重写该行为,请接受一个JsonRequestBehavior参数JSON的过载。

public ActionResult Index()

{

   return Json(data, JsonRequestBehavior.AllowGet)

}

当我第一次使用 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

这是安全问题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