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

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

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

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

ActionResult子types

  • ViewResult – 将指定的视图呈现给响应stream

  • PartialViewResult – 将指定的局部视图呈现给响应stream

  • EmptyResult – 返回一个空的响应

  • RedirectResult – 执行HTTPredirect到指定的URL

  • RedirectToRouteResult – 根据给定的路由数据,对由路由引擎确定的URL执行HTTPredirect

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

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

  • ContentResult – 将内容写入响应stream而不需要查看

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

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

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

资源

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

ActionResult是一个抽象类。

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

你用这种方式声明,所以你可以利用多态性并用相同的方法返回不同的types。

例如:

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

基于同样的原因,你不写每个类的每个方法来返回“对象”。 你应该尽可能具体。 如果你打算编写unit testing,这是特别有价值的。 没有更多的testing返回types和/或投射结果。

ViewResult是ActionResult的一个子类。 View方法返回一个ViewResult。 所以真的这两个代码片段做同样的事情。 唯一的区别是,使用ActionResult控制器是不希望返回一个视图 – 你可以改变方法体有条件地返回一个RedirectResult或其他东西,而不改变方法定义。

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

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

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

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

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

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

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

ViewResultActionResult一个子类。