为什么从重写的Json方法返回JSONResult不起作用,ContentResult的工作原理?
最近我发现了一个奇怪的场景,而试图覆盖控制器类的Json方法,这样我就可以使用JSON.net合同解析器。如果最后我返回一个ContentResult的对象并将其上传到ActionResult,它会很好地工作。然而,如果我尝试返回JSONResult的对象,它不起作用。为什么从重写的Json方法返回JSONResult不起作用,ContentResult的工作原理?
protected new ContentResult Json(object data, JsonRequestBehavior behaviour = JsonRequestBehavior.DenyGet)
{
var jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
if (Request.RequestType == WebRequestMethods.Http.Get && behaviour == JsonRequestBehavior.DenyGet)
{
throw new InvalidOperationException("GET is not permitted for this request");
}
var jsonResult = new ContentResult
{
Content = JsonConvert.SerializeObject(data, jsonSerializerSettings),
ContentType = "application/json",
};
return jsonResult;
}
这有什么解释吗?
你overrided Json
方法应返回JsonResult
。
你能与ContentResult
做becouse他们都从ActionResult
类继承。
如果你想在任何情况下,这方面的工作 - 你可以从你的重写返回ActionResult
。但是还有一个问题 - 所有使用这种方法的控制器方法也应该返回ActionResult
。
这可能不是一个大问题,但如果你想保持你的代码清洁,你应该实现你的逻辑为ActionFilterAttribute
并注册在FilterConfig
为全球使用。
我明白它为什么与ContentResult一起工作,但我完全不明白为什么当我使用JsonResult时它不起作用。当我返回JsonResult对象时,这就是我所得到的。 “此请求已被阻止,因为在GET请求中使用此信息时,可能会向第三方网站泄露敏感信息。要允许GET请求,请将JsonRequestBehavior设置为AllowGet”。这是我们在尝试调用默认Json方法而不指定AllowGet时所得到的结果。 –
@HemAcharya,你想要什么? allowGet总是? –
我不想让allowGet总是。但即使我从重写的方法返回JSONResult对象时显式传递JsonRequestBehaviour.AllowGet,我也会遇到我提到的错误。 –
不要同时使用JsonResult作为返回类型使用JsonRequestBehavior.AllowGet?
是的。我使用JsonRequestBehavior.AllowGet。但即使这样做,如果我从重载的方法返回JSON结果的对象,它通常会抛出相同的错误,如果我通常调用JSON方法(没有重载),而不通过AllowGet。 –
为什么不呢?怎么了? – SLaks