为什么从重写的Json方法返回JSONResult不起作用并且ContentResult有效?

时间:2017-01-30 15:04:03

标签: c# json ajax asp.net-mvc jsonresult

最近我在尝试覆盖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;
    }

对此有任何解释吗?

2 个答案:

答案 0 :(得分:1)

您的覆盖Json方法应该返回JsonResult

您可以使用ContentResult执行此操作,因为它们都从ActionResult类继承。

如果您希望在任何情况下都能正常工作 - 您可以从覆盖中返回ActionResult。但还有另一个问题 - 使用此方法的所有控制器方法也应该返回ActionResult

这可能不是一个大问题,但如果您想保持代码清洁,则应将您的逻辑实现为ActionFilterAttribute并在FilterConfig中注册以供全局使用。

答案 1 :(得分:0)

使用JsonResult作为返回类型时是否使用JsonRequestBehavior.AllowGet