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 。 其他派生类包括JsonResult和PartialViewResult 。
你用这种方式声明,所以你可以利用多态性并用相同的方法返回不同的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等
ViewResult
是ActionResult
一个子类。