ViewResult()和ActionResult()之间的区别

Dom*_*nic 292 asp.net asp.net-mvc

ViewResult()ActionResult()ASP.NET MVC有什么区别?

public ViewResult Index()
{
    return View();
}

public ActionResult Index()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

Div*_*ivi 369

ActionResult是一个抽象类,可以有几个子类型.

ActionResult子类型

  • ViewResult - 将指定的视图呈现给响应流

  • PartialViewResult - 将指定的部分视图呈现给响应流

  • EmptyResult - 返回空响应

  • RedirectResult - 执行HTTP重定向到指定的URL

  • RedirectToRouteResult - 根据给定的路由数据执行HTTP重定向到由路由引擎确定的URL

  • JsonResult - 将给定的ViewData对象序列化为 JSON格式

  • JavaScriptResult - 返回可在客户端上执行的一段JavaScript代码

  • ContentResult - 无需视图即可将内容写入响应流

  • FileContentResult - 将文件返回给客户端

  • FileStreamResult - 将文件返回给客户端,该文件由Stream提供

  • FilePathResult - 将文件返回给客户端

资源

  • 返回ViewResult而不是ActionResult的优点是什么 - 它只是更多的语义并显示你的意图 - 但实际上通常没有区别? (4认同)

RPM*_*984 118

ActionResult是一个抽象类.

ViewResult派生自ActionResult.其他派生类包括JsonResultPartialViewResult.

您以这种方式声明它,以便您可以利用多态并在同一方法中返回不同的类型.

例如:

public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}
Run Code Online (Sandbox Code Playgroud)

  • @Adarsh - 它与C#中的任何抽象类相同.如果要将实现封装在方法中,或者希望将来证明您的API用于其他派生类型,请以此方式声明.如果没有,请使用混凝土.我通常使用具体的(例如ViewResult或JsonResult) (4认同)
  • 这是否意味着我们应该始终返回 ActionResult 以便我们获得它的优势。或者这有什么限制或副作用吗? (3认同)

Ric*_*SFT 31

出于同样的原因,你不会写每个类的每个方法来返回"对象".你应该尽可能具体.如果您计划编写单元测试,这尤其有用.不再测试返回类型和/或转换结果.


Rob*_*evy 20

ViewResult是ActionResult的子类.View方法返回ViewResult.所以这两个代码片段确实完全相同.唯一的区别是,使用ActionResult,您的控制器不承诺返回视图 - 您可以更改方法体以有条件地返回RedirectResult或其他内容,而无需更改方法定义.


Zai*_*sud 11

虽然其他答案已正确注意到差异,但请注意,如果您实际上只返回ViewResult,则最好返回更具体的类型而不是基本的ActionResult类型.这个原则的一个明显例外是当你的方法返回从ActionResult派生的多个类型时.

有关此原则背后原因的完整讨论,请参阅此处的相关讨论:ASP.NET MVC控制器方法必须返回ActionResult吗?