当前位置 > 首页 > Asp.net

深入ASP.NET MVC之七:ActionResult的执行(View的加载和渲染)

2012-12-5 8:11:00来源:Asp.net

书再接回上文Filter和Action的执行 ,当Action方法被执行,返回了一个ActionResult之后,紧接着就要执行ActionResult了,当然还有Filter需要执行,这些都是发生在ControllerActionInvoker的InvokeActionResultWithFilters方法之中,这里面filter的执行和action方法被执行的时候执行相应的filter是一样的,已在Filter和Action的执行 中分析过了,不再讨论。直接看ActionResult的执行:

protected virtual void InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) {
actionResult.ExecuteResult(controllerContext);
}

当然这个方法没什么好看的,这是ActionResult的一个抽象方法。先看下ASP.NET MVC 3中继承自ActionResult的类:

System.Web.Mvc.ContentResult
System.Web.Mvc.EmptyResult
System.Web.Mvc.FileResult
System.Web.Mvc.HttpStatusCodeResult
System.Web.Mvc.JavaScriptResult
System.Web.Mvc.JsonResult
System.Web.Mvc.RedirectResult
System.Web.Mvc.RedirectToRouteResult
System.Web.Mvc.ViewResultBase

其中ViewResultBase是最常用的,它还有两个继承者:

System.Web.Mvc.PartialViewResult
System.Web.Mvc.ViewResult

本文先重点看下ViewResult这个最常用的ActionResult。它的ExecuteResult方法如下:

public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
if (String.IsNullOrEmpty(ViewName)) {
ViewName = context.RouteData.GetRequiredString(
"action");
}
ViewEngineResult result = null;
if (View == null) {
result = FindView(context);
View = result.View;
}

TextWriter writer = context.HttpContext.Response.Output;
ViewContext viewContext = new ViewContext(context, View, ViewData, TempData, writer);
View.Render(viewContext, writer);

if (result != null) {
result.ViewEngine.ReleaseView(context, View);
}
}

首先如果没有提供View的名字的话就默认是action的名字,然后调用FindView去查找对应的View:

protected override ViewEngineResult FindView(ControllerContext context) {
ViewEngineResult result = ViewEngineCollection.FindView(context, ViewName, MasterName);
if

  • Visual Studio 2010 Beta 2 announced with Go Live License

    2009-10-21 2:30:00

    Hi, Microsoft has announced the release of the Beta 2 of the Visual Studio 2010. MSDN Subscriber

  • Speed up your ASP.NET site with compression ? Aspguy's Weblog

    2011-11-23 6:48:00

    Read More......( read more )

  • 出栈序列研究

    2009-12-29 20:35:00

    阅读: 284 评论: 4 作者: John Waken 发表于 2009-12-29 16:32 原文链接 出栈序列研究 作者: John Waken 邮箱: JohnWa

  • SSCLI中GC垃圾回收源码分析(2) - GarbageCollect()与Spin Lock

    2009-9-14 21:41:00

    摘要: 继续接着上篇的分析, F11从Fcall中跳出来,就到了sscli20\clr\src\vm\gcsmp.cpp中关于Garbage Collect的最外部的方法GCHeap::Garba

  • 求助一个p2p的测试算法

    2009-8-16 15:41:00

    摘要: 我做了一个P2P的系统,想测试一下它的性能,于是想做一个测试程序,我把数据都收集好了,可是对数据的分析的算法却无从下手,各位大侠们感兴趣的不妨试一下如何解决这个问题。 问题前奏:被测试的程

  • 简单介绍 P3P 技术

    2009-11-30 13:26:00

    以 Internet Explorer 为例,默认情况下,IE的隐私策略如下图所设: (图一) 请注意其中这一条: 阻止保存可用来联系您的信息而没有您的明确同意的第三方Cookie

  • 别在领域模型迷失了自己

    2007-9-28 12:06:00

    摘要: 本不想对这个图书馆再掀话题﹐看了亚同志的重构图书馆惊魂夜﹐觉得还是有必要完整地解释一下图书馆与领域模型﹐毕竟这个问题由我而起﹐善终一下吧 阅读全文 小生 2007-09-28 1

  • [从架构到设计]第一回:设计,应该多一点

    2007-8-16 0:03:00

    摘要: 开始想尝试尝试写点设计的东西了,只所以有了这个“突如其来”的想法,原因其实很简单:因为对设计、架构、分层、模式,我很陌生。因为陌生,所以接触,因为接触,所以随笔。系列之构思就这么诞生了。因此

  • 基于Cairngorm的Silverlight开发系列

    2009-3-31 3:57:00

    摘要: 最近做了几个silverlight的项目都用到了MVC的开发架构,在silverlight中,MVC、MVVM等架构都很多。各个第三方的公司在推出自己的架构的同时也专门会发布一个for si

  • SQL Server 2008 Service Pack 1 Cumulative Update 1

    2009-4-18 0:44:00

    SQL Server 2008 SP以及累计更新包之间的关系还真的有点乱。 SQL Server 2008 SP1刚刚发布,现在没几天出来一个CU1 for SP1。 目前的这个CU1是