ViewResult()
和ActionResult()
ASP.NET MVC 和有什么不一样?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
ViewResult()
和ActionResult()
ASP.NET MVC 和有什么不一样?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Answers:
ActionResult是一个抽象类,可以有多个子类型。
ViewResult-将指定的视图呈现到响应流
PartialViewResult-将指定的局部视图渲染到响应流
EmptyResult-返回空响应
RedirectResult-执行HTTP重定向到指定的URL
RedirectToRouteResult-根据给定的路由数据执行HTTP重定向到由路由引擎确定的URL
JsonResult-将给定的ViewData对象序列化为 JSON格式
JavaScriptResult-返回一段可以在客户端上执行的JavaScript代码
ContentResult-将内容写入响应流而无需查看
FileContentResult-将文件返回给客户端
FileStreamResult-将文件返回给客户端,该文件由Stream提供
FilePathResult-将文件返回给客户端
ActionResult是一个抽象类。
ViewResult源自ActionResult。其他派生类包括JsonResult和PartialViewResult。
您以这种方式声明它,以便可以利用多态性并在同一方法中返回不同的类型。
例如:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
出于同样的原因,您没有编写每个类的每个方法来返回“对象”。您应该尽可能具体。如果您打算编写单元测试,这特别有价值。没有更多的测试返回类型和/或强制转换结果。
尽管其他答案正确地指出了这些区别,但是请注意,如果实际上您仅返回ViewResult,则最好返回更具体的类型,而不是基本的ActionResult类型。该原理的一个明显例外是当您的方法返回从ActionResult派生的多个类型时。
有关此原理背后原因的完整讨论,请参见此处的相关讨论:ASP.NET MVC控制器方法必须返回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
。
在Controller中,我用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作为返回类型。