[转载]深入理解ASP.NET MVC之ActionResult
2014-01-15 08:14
681 查看
Action全局观
在上一篇最后,我们进行到了Action调用的“门口”:![](http://images.cnblogs.com/cnblogs_com/P_Chou/WindowsLiveWriter/ASP.NETMVC6_12075/image_thumb.png)
查找action:MVC内部查找action的方法似乎有点复杂,涉及到一个ActionDescriptor的东西,但是原理上是通过反射,在以后的文章中会有所涉及。
验证和过滤:众所周知的IActionFilter和IAuthorizationFilter在这部分生效,它们在真正执行action之前,事实上对于IResultFilter或IExceptionFilter这样的过滤器是在action执行之后执行的,图中对于这个没有画出。
执行action:真正进入用户代码执行,通过反射调用,调用之前还涉及到复杂的参数提供和绑定,在以后的文章中会涉及。
执行结果:ActionResult在这部起到了关键的作用,ActionResult有多个派生,其中最为常见的就是ViewResult。ActionResult是前面步骤执行的最终“果实”,通过执行ActionResult的ExecuteResult抽象方法,一个HttpRespose被正确的构造好,准备传回客户端。
从ActionResult开始说起
就像上一篇讲到的,我们可以在Controller的Execute方法中直接对HttpContext.Response操作,绕过action;即便我们走了action这一路,仍然可以在action中像下面这样直接操作Response:ActionResult是一个十足的抽象类,抽象到不能再抽象了,它定义了唯一的ExecuteResult方法,参数为一个ControllerContext,其中封装了包括HttpContext在内的许多对象,也是重写这个方法唯一的上下文信息:
![](http://images.cnblogs.com/cnblogs_com/P_Chou/WindowsLiveWriter/ASP.NETMVC6_12075/image_thumb_1.png)
我们可以看个简单的实现类RedirectResult是如何实现ExecuteResult的。在这里我发现了我曾经遇到过的一个异常的原因:Child actions are not allowed to perform redirect actions,意思是在子action不允许重定向。
在Controller中有很多辅助方法便于我们在action中返回需要的ActionResult,下面列出:
Content():返回ContentResult
大家都很少用到这个ActionResult,因为它的基本用法是返回文本,也许下面这段代码可以说服你事实上我们的action可以返回一个非ActionResult,MVC在执行action的返回结果前,会确保将返回值转换成一个ActionResult,其中一步,就是对非空和非ActionResult的结果转换成string,并包装成ContentResult:
Json():返回JsonResult
Controller的Json方法能返回一个JsonResult,出于安全性的考虑JsonResult只支持POST方式,设置response.ContentType = "application/json";并利用JavaScriptSerializer序列化对象,并返回给客户端。像下面这样使用JsonResult:JavaScript():返回JavaScriptResult
JavaScript方法实例化一个JavaScriptResult,JavaScriptResult只是简单的设置response.ContentType = "application/x-javascript";File():返回二进制数据或文件
FileResult是个抽象类,File方法的多个重载返回不同的FileResult:FilePathResult:直接将一个文件发送给客户端
<img src="<%: Url.Action("GetImage", "Products", new { Model.ProductID }) %>" />
FileStreamResult:返回流
public FileStreamResult ProxyExampleDotCom() { WebClient wc = new WebClient(); Stream stream = wc.OpenRead("http://www.example.com/"); return File(stream, "text/html"); }
PartialView()和View():分别返回PartialViewResult和ViewResult
PartialViewResult和ViewResult十分复杂,涉及到视图,将在以后详细讨论。Redirect():返回RedirectResult
产生重定向结果,上面已经展示了RedirectResult的实现了。RedirectToAction(),RedirectToRoute():返回RedirectToRouteResult
RedirectToRouteResult同样是产生跳转的结果,但是它具有“路由表遍历能力”,也就是具有Url outbound的特点,参见深入理解ASP.NET MVC(3)原文地址:/article/5007755.html
相关文章推荐
- 【转载】理解ASP.NET MVC中的ActionResult
- 理解ASP.NET MVC中的ActionResult
- 理解ASP.NET MVC中的ActionResult [转 深山老林]
- 理解ASP.NET MVC中的ActionResult
- 理解ASP.NET MVC中的ActionResult
- 关于asp.net mvc中Controller中的方法返回值类型ActionResult及其子类的理解
- [转载] ASP.NET MVC (一)——深入理解ASP.NET MVC
- 理解ASP.NET MVC中的ActionResult
- 理解ASP.NET MVC中的ActionResult
- 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC
- 转载 ASP.NET MVC学习之(5):Html.ActionLink
- ASP.NET MVC中Controller返回值类型ActionResult
- ASP.NET MVC 重点教程一周年版 第五回 ActionResult的其它返回值
- ASP.NET MVC ActionResult的其它返回值
- 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC
- ASP.NET MVC 重点教程一周年版 第五回 ActionResult的其它返回值
- 深入理解ASP.NET MVC(目录)
- 深入理解ASP.NET MVC(9)
- 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC
- ASP.NET MVC 重点教程一周年版 第五回 ActionResult的其它返回值