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

时间:2011-01-20 05:27:51

标签: asp.net asp.net-mvc

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

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

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

8 个答案:

答案 0 :(得分:365)

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

ActionResult子类型

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

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

  • EmptyResult - 返回空响应

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

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

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

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

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

  • FileContentResult - 将文件返回给客户

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

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

资源

答案 1 :(得分:117)

ActionResult 是一个抽象类。

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

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

e.g:

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

答案 2 :(得分:31)

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

答案 3 :(得分:20)

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

答案 4 :(得分:11)

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

有关此原则背后原因的完整讨论,请参阅此处的相关讨论:Must ASP.NET MVC Controller Methods Return ActionResult?

答案 5 :(得分:4)

在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的子类。

答案 6 :(得分:0)

在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是最好的选择。

答案 7 :(得分:0)

为节省您的时间,此处是上一个答案的链接,答案为https://forums.asp.net/t/1448398.aspx

ActionResult是一个抽象类,它是ViewResult类的基类。

在MVC框架中,它使用ActionResult类来引用您的操作方法返回的对象。并在其上调用ExecuteResult方法。

ViewResult是此抽象类的实现。它将尝试通过给定的视图名称在一些预定义的路径(/ views / controllername /,/ views / shared /等)中找到视图页面(通常是aspx页面)。

通常最好的方法是让您的方法返回更具体的类。因此,如果您确定操作方法将返回某些视图页面,则可以使用ViewResult。但是,如果您的操作方法可能具有不同的行为,例如渲染视图或执行重定向。您可以使用更通用的基类ActionResult作为返回类型。