asp.net mvc ActionResult

定义在Controller中的Action方法大都返回一个ActionResult对象。ActionResult是对Action执行结果的封装,用于最终对请求进行响应。ASP.NET MVC提供了一系列的ActionResult。

1. ActionResult对请求的响应

HTTP是一个单纯的采用请求/回复消息交换模式的网络协议,Web服务器在接收并处理来自客户端的请求后会根据处理结果对请求予以响应。对于来自客户端的访问请求,最终的处理体现在针对目标Action方法的执行,我们可以在定义Action方法的时候人为地控制对请求的响应。如果下面的代码片断所示,抽象类Controller具有一个只读的Response属性表示当前的HttpResponse,我们可以直接利用它来实现对请求的响应。我们也可以间接地通过表示当前HTTP上下文的HttpContext属性和表示Controller上下文的ControllerContext属性来获取用于响应请求的HttpResponse对象。

 1 public abstract class Controller : ControllerBase, ...
 2    {
 3        //其他成员
 4        public HttpResponseBase Response { get; }
 5        public HttpContextBase HttpContext { get; }
 6    }
 7     
 8    public abstract class ControllerBase : IController
 9    {
10        //其他成员
11        public ControllerContext ControllerContext { get; set; }
12    }

原则上讲,我们可以利用HttpResponse对请求响应作百分之一百地控制,但是我们一般并不这么做,而是将针对请求的响应实现在一个ActionResult对象中。如下面的代码片断所示,ActionResult是一个抽象类型,最终的请求响应实现在抽象方法ExecuteResult方法中。

1 public abstract class ActionResult
2 {    
3     //其他成员
4     public abstract void ExecuteResult(ControllerContext context);
5 }

顾名思义,ActionResult就是执行Action的结果。ActionInvoker在完成对Action方法的执行后,如果返回一个ActionResult对象,ActionInvoker会将当前Controller上下文作为参数调用其ExecuteResult方法。View的最终呈现是通过ActionResult的子类ViewResult来完成的,除了ViewResult,ASP.NET MVC还为我们定义了额外一些具体的ActionResult。

1.1 ActionResult 类是操作结果的基类。下面是其相关的继承层次结构:

1.2 对应的辅助方法:

2. Result的相应示例

2.1 Content():返回ContentResult

public ContentResult ContentResult()
        {
            return Content("123");
        }

2.2 Json():返回JsonResult

Json方法能返回一个JsonResult,此方法会把response.ContentType = "application/json"。默认情况下这种方式只支持post请求,若想允许get请求可以使用重载方法。

1 public JsonResult JsonResult()
2         {
3             var obj = new { id="123",name="rj"};
4 
5             return Json(obj, JsonRequestBehavior.AllowGet);
6         }

2.3 JavaScript():返回JavaScriptResult

JavaScript方法实例化一个JavaScriptResult,JavaScriptResult只是简单的设置response.ContentType = "application/x-javascript";

1 public JavaScriptResult JavaScriptResult()
2         {
3             return JavaScript("alert('123');");
4         }

2.4 File():返回二进制数据或文件

1 public FilePathResult FilePathResult()
2         {
3             string filename = Server.MapPath("/Image/622762d09a82581ea1ec9c77.jpg");
4             return File(filename, "image/jpeg");
5         }

2.5 其他类型

PartialView()和View():分别返回PartialViewResult和ViewResult

返回局部视图

Redirect():返回RedirectResult

重定向

RedirectToAction(),RedirectToRoute():返回RedirectToRouteResult

RedirectToRouteResult同样是产生跳转的结果,但是它具有“路由表遍历能力”,也就是具有Url outbound的特点

posted @ 2017-01-12 11:53  一品码农  阅读(750)  评论(0编辑  收藏  举报