为什么从重写的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; 
    } 

这有什么解释吗?

+0

为什么不呢?怎么了? – SLaks

你overrided Json方法应返回JsonResult

你能与ContentResult做becouse他们都从ActionResult类继承。

如果你想在任何情况下,这方面的工作 - 你可以从你的重写返回ActionResult。但是还有一个问题 - 所有使用这种方法的控制器方法也应该返回ActionResult

这可能不是一个大问题,但如果你想保持你的代码清洁,你应该实现你的逻辑为ActionFilterAttribute并注册在FilterConfig为全球使用。

+0

我明白它为什么与ContentResult一起工作,但我完全不明白为什么当我使用JsonResult时它不起作用。当我返回JsonResult对象时,这就是我所得到的。 “此请求已被阻止,因为在GET请求中使用此信息时,可能会向第三方网站泄露敏感信息。要允许GET请求,请将JsonRequestBehavior设置为AllowGet”。这是我们在尝试调用默认Json方法而不指定AllowGet时所得到的结果。 –

+0

@HemAcharya,你想要什么? allowGet总是? –

+0

我不想让allowGet总是。但即使我从重写的方法返回JSONResult对象时显式传递JsonRequestBehaviour.AllowGet,我也会遇到我提到的错误。 –

不要同时使用JsonResult作为返回类型使用JsonRequestBehavior.AllowGet

+0

是的。我使用JsonRequestBehavior.AllowGet。但即使这样做,如果我从重载的方法返回JSON结果的对象,它通常会抛出相同的错误,如果我通常调用JSON方法(没有重载),而不通过AllowGet。 –