何时使用JsonResult而不是ActionResult

CSh*_*per 22 c# asp.net-mvc json return-value asp.net-mvc-4

我一直无法找到关于这个问题的具体答案.我已经查看了这个问题以及其他地方的帖子和后续帖子,但我真正读到的只是JsonResult有一个硬编码的内容类型,并且确实没有任何性能提升.

如果两个结果都可以返回Json,为什么需要在ActionResult上使用JsonResult.

public ActionResult()
{
    return Json(foo)
}

public JsonResult()
{
    return Json(bar)
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释ActionResult无法完成工作并且必须使用JsonResult的情况.如果没有,为什么JsonResult首先存在.

Ily*_*kin 18

当使用JsonResultActionResult

我通常会返回具体的结果(例如JsonResult,ViewResult),并有我的优点:

人们支持这种方法有一些链接:

Pro ASP.NET MVC 3框架引用了一句话:

注意请注意,列表中action方法的返回类型是ViewResult.如果我们指定了更通用的ActionResult类型,那么该方法也可以编译和工作.事实上,一些MVC程序员会将每个动作方法的结果定义为 ActionResult,即使他们知道它总会返回一个更具体的类型.我们在下面的示例中特别勤奋地阐述了如何使用每种结果类型,但我们在实际项目中往往更加放松.

ActionResult只有当一个动作应该返回不同类型的结果时,我才会使用具体的一个.但这不是常见的情况.

我还想添加ActionResult一个抽象类,这样你就不能简单地创建这种类型的实例并返回它.JsonResult具体是因为您可以创建其实例并从操作方法返回.还有许多其他类型派生自ActionResult并且基本上所有这些类型都用于覆盖ExecuteResult方法.

public abstract class ActionResult
{
    public abstract void ExecuteResult(ControllerContext context);
} 
Run Code Online (Sandbox Code Playgroud)

此方法由ControllerActionInvoker逻辑写入response对象并实现逻辑.

ControllerActionInvoker不知道具体的结果,以便它可以处理从派生ActionResult和实现的任何结果ExecuteResult.

在这两种情况下,您都会JsonResult在示例中返回一个类型实例,Json(model)它只是一个创建实例的工厂方法JsonResult.

还有另一个问题是,方法的数据类型是否尽可能具体或更一般?讨论了方法参数和返回值的最佳实践.

一般的想法提供抽象类型作为参数,以便您的方法可以处理更广泛的参数; 返回足够多的类型,以便客户不需要转换或转换它们.