ASP.NET MVC 中的 ViewResult()
和 ActionResult()
有什么区别?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
ActionResult 是一个抽象类,可以有多个子类型。
ActionResult 子类型
ViewResult - 将指定的视图呈现给响应流
PartialViewResult - 将指定的部分视图呈现给响应流
EmptyResult - 返回一个空响应
RedirectResult - 执行到指定 URL 的 HTTP 重定向
RedirectToRouteResult - 根据给定的路由数据,对路由引擎确定的 URL 执行 HTTP 重定向
JsonResult - 将给定的 ViewData 对象序列化为 JSON 格式
JavaScriptResult - 返回一段可以在客户端执行的 JavaScript 代码
ContentResult - 将内容写入响应流而不需要视图
FileContentResult - 将文件返回给客户端
FileStreamResult - 将文件返回给客户端,由 Stream 提供
FilePathResult - 将文件返回给客户端
资源
动作方法的 ActionResult 和 ViewResult 有什么区别? [ASP.NET 论坛]
ActionResult 是一个抽象类。
ViewResult 派生自 ActionResult。其他派生类包括 JsonResult 和 PartialViewResult。
您以这种方式声明它,以便您可以利用多态性并在同一方法中返回不同的类型。
例如:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
出于同样的原因,您不会编写每个类的每个方法来返回“对象”。你应该尽可能具体。如果您打算编写单元测试,这尤其有价值。不再测试返回类型和/或转换结果。
ViewResult 是 ActionResult 的子类。 View 方法返回一个 ViewResult。所以这两个代码片段确实做了完全相同的事情。唯一的区别是,对于 ActionResult 之一,您的控制器不承诺返回视图 - 您可以更改方法主体以有条件地返回 RedirectResult 或其他内容,而无需更改方法定义。
虽然其他答案已经正确指出了差异,但请注意,如果您实际上只返回 ViewResult ,最好返回更具体的类型而不是基本 ActionResult 类型。此原则的一个明显例外是当您的方法返回派生自 ActionResult 的多种类型时。
有关此原则背后原因的完整讨论,请参阅此处的相关讨论:Must ASP.NET MVC Controller Methods Return ActionResult?
在 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 等。
ViewResult
是 ActionResult
的子类。
在控制器中,我使用 ActionResult 指定了以下代码,它是 MVC 中可以有 11 个子类型的基类,例如:ViewResult、PartialViewResult、EmptyResult、RedirectResult、RedirectToRouteResult、JsonResult、JavaScriptResult、ContentResult、FileContentResult、FileStreamResult、FilePathResult。
public ActionResult Index()
{
if (HttpContext.Session["LoggedInUser"] == null)
{
return RedirectToAction("Login", "Home");
}
else
{
return View(); // returns ViewResult
}
}
//More Examples
[HttpPost]
public ActionResult Index(string Name)
{
ViewBag.Message = "Hello";
return Redirect("Account/Login"); //returns RedirectResult
}
[HttpPost]
public ActionResult Index(string Name)
{
return RedirectToRoute("RouteName"); // returns RedirectToRouteResult
}
同样,我们可以使用 ActionResult() 返回所有这 11 个子类型,而无需显式指定每个子类型方法。如果您要返回不同类型的视图,ActionResult 是最好的选择。
为了节省您的时间,这里是来自 https://forums.asp.net/t/1448398.aspx 上一个答案中的链接的答案
ActionResult 是一个抽象类,是 ViewResult 类的基类。
在 MVC 框架中,它使用 ActionResult 类来引用您的操作方法返回的对象。并在其上调用 ExecuteResult 方法。
而 ViewResult 是这个抽象类的一个实现。它将尝试通过给定的视图名称在一些预定义的路径(/views/controllername/、/views/shared/ 等)中查找视图页面(通常是 aspx 页面)。
让您的方法返回更具体的类通常是一个好习惯。因此,如果您确定您的操作方法将返回一些视图页面,您可以使用 ViewResult。但是,如果您的操作方法可能具有不同的行为,例如呈现视图或执行重定向。您可以使用更通用的基类 ActionResult 作为返回类型。
不定期副业成功案例分享