最近我在尝试覆盖Controller类的Json方法时发现了一个奇怪的场景,以便我可以使用JSON.net合约解析器。如果最后我返回ContentResult的一个对象并将其向上转换为ActionResult,它将完美地运行。但是,如果我尝试返回JSONResult的对象,它就不起作用。
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;
}
对此有任何解释吗?
答案 0 :(得分:1)
您的覆盖Json
方法应该返回JsonResult
。
您可以使用ContentResult
执行此操作,因为它们都从ActionResult
类继承。
如果您希望在任何情况下都能正常工作 - 您可以从覆盖中返回ActionResult
。但还有另一个问题 - 使用此方法的所有控制器方法也应该返回ActionResult
。
这可能不是一个大问题,但如果您想保持代码清洁,则应将您的逻辑实现为ActionFilterAttribute
并在FilterConfig
中注册以供全局使用。
答案 1 :(得分:0)
使用JsonResult作为返回类型时是否使用JsonRequestBehavior.AllowGet?