ASP.NET MVC - ActionResult 及其 派生类

创建时间:
2015-10-27 15:07
最近更新:
2018-09-16 22:04

Inheritance Hierarchy

System.Object
    System.Web.Mvc.ActionResult
        System.Web.Mvc.ContentResult
        System.Web.Mvc.EmptyResult
        System.Web.Mvc.FileResult
            System.Web.Mvc.FileContentResult
            System.Web.Mvc.FilePathResult
            System.Web.Mvc.FileStreamResult
        System.Web.Mvc.HttpStatusCodeResult
            System.Web.Mvc.HttpNotFoundResult
            System.Web.Mvc.HttpUnauthorizedResult
        System.Web.Mvc.JavaScriptResult
        System.Web.Mvc.JsonResult
        System.Web.Mvc.RedirectResult
        System.Web.Mvc.RedirectToRouteResult
        System.Web.Mvc.ViewResultBase
            System.Web.Mvc.PartialViewResult
            System.Web.Mvc.ViewResult

Resource - MSDN

  1. System.Web.Mvc.ActionResult - 封装一个操作方法的结果并用于代表该操作方法执行框架级操作。
  2. System.Web.Mvc.ContentResult - 表示用户定义的内容类型,该类型是操作方法的结果。
  3. System.Web.Mvc.EmptyResult - 表示一个不执行任何操作的结果,如不返回任何内容的控制器操作方法。此类遵循称为 Null 对象模式的模式。
  4. System.Web.Mvc.FileContentResult - 将二进制文件的内容发送到响应。
  5. System.Web.Mvc.FilePathResult - 将文件的内容发送到响应。
  6. System.Web.Mvc.FileResult - 表示一个用于将二进制文件内容发送到响应的基类。
  7. System.Web.Mvc.FileStreamResult - 使用 Stream 实例将二进制内容发送到响应。
  8. System.Web.Mvc.HttpNotFoundResult - 定义一个用于指示未找到所请求资源的对象。http status code is 404.
  9. System.Web.Mvc.HttpStatusCodeResult - 提供一种用于返回带特定 HTTP 响应状态代码和说明的操作结果的方法。
  10. System.Web.Mvc.HttpUnauthorizedResult - 表示未经授权的 HTTP 请求的结果。
  11. System.Web.Mvc.JavaScriptResult - 将 JavaScript 内容发送到响应。
  12. System.Web.Mvc.JsonResult - 表示一个类,该类用于将 JSON 格式的内容发送到响应。
  13. System.Web.Mvc.PartialViewResult - 表示一个用于将分部视图发送到响应的基类。
  14. System.Web.Mvc.RedirectResult - 通过重定向到指定的 URI 来控制对应用程序操作的处理。
  15. System.Web.Mvc.RedirectToRouteResult - 表示使用指定的路由值字典来执行重定向的结果。
  16. System.Web.Mvc.ViewResult - 表示一个类,该类用于使用由 IViewEngine 对象返回的 IView 实例来呈现视图。
  17. System.Web.Mvc.ViewResultBase - 表示一个用于为视图提供模型并向响应呈现视图的基类。ViewResultBase 类是 ViewResult 和 PartialViewResult 类的抽象基类。此类包含用于查找要呈现的视图的方法和用于执行结果的方法。此类还包含用于为应用程序标识要呈现的视图的属性、视图的名称、视图数据、临时数据以及视图引擎集合。

Resouce

  1. B250:G:\z\D1526Backup\CodeAccumulation\AspNet & C#\Mvc\ActionResult继承图.png
  2. 了解 ASP.NET MVC 几种 ActionResult 的本质
  3. ASP.NET MVC 中 Controller 的返回值的类型 ActionResult

MVC 内置了很多实用的 ActionResult

Action Result Helper Method Description
ContentResult Content Returns a user defined content type
EmptyResult EmptyResult.Instance 或 new EmptyResult() 或 return null Used with void action methods which doesn’t return a value
FileResult File Returns binary output to write to the response
FileContentResult File Returns the content of a file
FilePathResult File Returns a file path
FileStreamResult File Returns a file stream
HttpNotFoundResult Returns HTTP Not Found
HttpStatusCodeResult Returns an HTTP Status code
HttpUnauthorizedResult Return HTTP Not Authorized
JavaScriptResult JavaScript Returns a script that can be executed on the client
JsonResult Json Returns a serialized JSON object
PartialViewResult PartialView Returns a partial view. A partial view has the same role as a user control. A partial view will be rendered within a main view
RedirectResult Redirect Redirects to another action method based on its URL
RedirectToRouteResult RedirectToAction RedirectToRoute Redirects to another action method
ViewResult View Returns a view as a webpage

为什么要使用 ActionResult (网摘)

我们可以在 Controller 的 Execute 方法中直接对 HttpContext.Response 操作,绕过 Action; 即便我们走了 Action 这一路,仍然可以在 Action 中像下面这样直接操作 Response:

public class ExampleController : Controller
{
    public void ExampleAction()
    {
        Response.Write("some string");
        //or:
        Response.Redirect("~/some/other/url");
        //or:
        Response.TransmitFile("c:/files/somefile.zip");
    }
}

然而这种方式难以维护,而且难以单元测试,于是 MVC 框架建议 Action 返回 ActionResult,并由框架调用 ActionResult 的 ExecuteResult 方法,这类似于设计模式中的 Command 模式。这种设计模式用在这里十分适合。

ActionResult 是一个十足的抽象类,抽象到不能再抽象了,它定义了唯一的 ExecuteResult 方法,参数为一个 ControllerContext,其中封装了包括 HttpContext 在内的许多对象,也是重写这个方法唯一的上下文信息:

namespace System.Web.Mvc
{
    public abstract class ActionResult
    {
        public abstract void ExecuteResult(ControllerContext context);
    }
}

用法示例

ASP.NET MVC 中 Controller 的返回值的类型 ActionResult 中有一组示例。

以下是另一组示例:

public class ActionResultController : Controller
{

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

    public ActionResult ContentResult()
    {
        return Content("Hi, 我是ContentResult成果");
    }

    public ActionResult EmptyResult()
    {
        //空成果当然是空白了!
        return new EmptyResult();
    }

    public ActionResult FileResult()
    {
        var imgPath = Server.MapPath("~/demo.jpg");
        return File(imgPath, "application/x-jpg", "demo.jpg");
    }

    public ActionResult HttpNotFoundResult()
    {
        return HttpNotFound("Page Not Found");
    }

    public ActionResult HttpUnauthorizedResult()
    {
        //未验证时,跳转到Logon
        return new HttpUnauthorizedResult();
    }

    public ActionResult JavaScriptResult()
    {
        string js = "alert('Hi, I am JavaScript.');";
        return JavaScript(js);
    }

    public ActionResult JsonResult()
    {
        var jsonObj = new
        {
            Id = 1,
            Name = "小铭",
            Sex = "男",
            Like = "足球"
        };
        return Json(jsonObj, JsonRequestBehavior.AllowGet);
    }

    public ActionResult RedirectResult()
    {
        return Redirect("~/demo.jpg");
    }

    public ActionResult RedirectToRouteResult()
    {
        return RedirectToRoute(new
        {
            controller = "Hello",
            action = ""
        });
    }

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

    public ActionResult PartialViewResult()
    {
        return PartialView();
    }

    //禁止直接接见的ChildAction
    [ChildActionOnly]
    public ActionResult ChildAction()
    {
        return PartialView();
    }

    //正确应用ChildAction
    public ActionResult UsingChildAction()
    {
        return View();
    }

}

InvokeAction 的执行步骤 (网摘)

  1. 查找 Action。MVC 内部通过 ActionDescriptor 查找 Action,原理上是通过反射。
  2. 验证和过滤。
  3. 执行 Action。真正进入用户代码执行,通过反射调用,调用之前还涉及到复杂的参数提供和绑定。
  4. 执行结果。ActionResult 在这一步起到了关键的作用,ActionResult 有多个派生,其中最为常见的就是 ViewResult。ActionResult 是前面步骤执行的最终 "果实",通过执行 ActionResult 的 ExecuteResult 抽象方法,一个 HttpRespose 被正确的构造好,准备传回客户端。

测试记录 - Action 无返回值

测试代码

public void Action()
{
}

测试结果

在 IE 的 F12 中,响应的 Content-Length 值为 0,响应正文为 "没有要查看的数据",$.ajax()success 回调函数被触发。

待测试 - Action 返回 null/EmptyResult

public ActionResult Action()
{
    return null;
}
public ActionResult Action()
{
    return new EmptyResult();
}