【问题标题】:why returning JSONResult from overridden Json method doesn't work and ContentResult works?为什么从覆盖的 Json 方法返回 JSONResult 不起作用而 ContentResult 起作用?
【发布时间】:2017-01-30 15:04:02
【问题描述】:

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

对此有什么解释吗?

【问题讨论】:

  • 为什么不呢?会发生什么?

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


【解决方案1】:

您覆盖的Json 方法应返回JsonResult

您可以使用 ContentResult 来做到这一点,因为它们都继承自 ActionResult 类。

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

这可能不是什么大问题,但如果您想保持代码干净,您应该将您的逻辑实现为 ActionFilterAttribute 并将其注册到 FilterConfig 以供全球使用。

【讨论】:

  • 我理解为什么它可以与 ContentResult 一起使用,但我完全不明白为什么当我使用 JsonResult 时它不起作用。当我返回 JsonResult 对象时,这就是我得到的。 “此请求已被阻止,因为在 GET 请求中使用此信息时可能会将敏感信息泄露给第三方网站。要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet”。这是我们在尝试调用默认 Json 方法而不指定 AllowGet 时得到的。
  • @HemAcharya 那你想要什么?总是允许获取?
  • 我不想总是允许获取。但是,即使我在从重写的方法返回 JSONResult 对象时显式传递 JsonRequestBehaviour.AllowGet ,我也会收到我提到的错误。
【解决方案2】:

在使用 JsonResult 作为返回类型时,你使用 JsonRequestBehavior.AllowGet 吗?

【讨论】:

  • 是的。我使用 JsonRequestBehavior.AllowGet。但即使这样做,如果我从重载方法返回 JSON 结果的对象,如果我通常在不传递 AllowGet 的情况下调用 Json 方法(不重载),它基本上会抛出相同的错误。
猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2018-07-06
  • 1970-01-01
相关资源
最近更新 更多