提问



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


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

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

最佳参考


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


ActionResult子类型




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

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

  • EmptyResult - 返回空响应

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

  • RedirectToRouteResult - 执行HTTP重定向到由
    路由引擎,基于给定的路由数据

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

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

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

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

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

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



资源




  • ActionResult和ViewResult for action方法有什么区别?[[ASP.NET论坛]]


其它参考1


ActionResult 是一个抽象类。[10] [11]


ViewResult 派生自 ActionResult 。其他派生类包括 JsonResult PartialViewResult


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


例如:


public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}

其它参考2


出于同样的原因,你不会写每个类的每个方法来返回对象。你应该尽可能具体。如果您计划编写单元测试,则此功能特别有用。不再需要测试返回类型和/或转换结果。

其它参考3


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

其它参考4


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


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

其它参考5


在Controller中,可以使用以下语法


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

public ActionResult EditEmployee() {
    return View();
}


在上面的示例中,只有返回类型不同。一个返回ViewResult而另一个返回ActionResult


ActionResult是一个抽象类。它可以接受:


ViewResult,PartialViewResult,EmptyResult,RedirectResult,RedirectToRouteResult,JsonResult,JavaScriptResult,ContentResult,FileContentResult,FileStreamResult,FilePathResult等。


ViewResultActionResult的子类。