当前位置 > 首页 > 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

  • .net中如何调用jar文件夹包

    2011-1-14 8:36:00

    同事提供了一个.jar包,我想将其生成DLL,或使用其它方法,可以在。NET中调用该包中的方法。如有操作过的,请指点下,谢谢。

  • SharePoint SDK中关于定制列表模板的问题

    2007-5-16 1:44:00

    信息来源: Joris [MVP Windows SharePoint Services] http://jopx.blogspot.com 就是那个在自己blog上放了超级多资

  • Enterprise Library 3.1的研究之路---Data Access Application Block(1)

    2007-9-18 13:29:00

    前言: 很多的时候,我们不需要重复的开发轮子(练技术的除外),我们的目的主要的是怎么样高效,安全,稳定的开发一个企业系统.很多好的框架我们可以拿来使用.没必要什么都从底层写.Enterpris

  • 在.NET中嵌入IronPython 交互

    2009-11-2 16:52:00

    阅读: 259 评论: 0 作者: 双宇 发表于 2009-11-02 14:16 原文链接 随着IronPyhon 2.0 的发布,.NET Dynamic Language Runti

  • QT 移植到Symbian,Tower版新鲜尝尝看

    2009-7-2 0:37:00

    首先听到QT被Nokia收购,再到看到Nokia宣布Symbian对QT的支持计划,想必一些人早就心怀期盼,可是Nokia的Release计划一推再推,总算看到了Garden版,2009-06-25

  • 工作感言:任务分配及管理

    2009-9-6 23:19:00

    摘要: 前面说到过,刚开始带小组,接到一个任务,我就估算了我大概要多少时间,然后小组多少个人就算是多少个我,估算时间=我要的总时间小组人数(好笨的想法呀,不用时间跟组员交待任务的吗?个个

  • 从互联星空的SSO设计谈Passport

    2007-1-26 13:34:00

    这个设计应该是上海设计院设计的,我发出来的文档内容来自互联星空规范2.0版本,因为保密关系所以只截取概念部分,具体实现细节和编程文档就不发出来了 以下内容来自中国电信互联星空规范ver2.0,只

  • 老南瓜:C#通过AMO对象模型浏览SQL SERVER 2005 SSAS角色一例

    2009-8-31 9:22:00

    摘要: C#通过AMO对象模型浏览SQL SERVER 2005 SSAS角色一例用过SSAS的朋友都使用Visual Studio Business Intelligence Developmen

  • ProMesh.NET: 开源的.net MVC框架

    2007-8-30 23:55:00

    如果你已经很习惯于微软提供的webform框架,熟练的拖放设置各个控件,现在不如尝试下 这个 开源的MVC框架,站在另外的角度审视我们每天使用MS给我们提供的标准框架,会得到不少的收获。

  • 实战 HTTP 处理程序(HTTP Handler) (4)--与Web程序共享Session

    2007-9-5 10:07:00

    摘要: 让 HTTP 处理程序与当前的Web程序共享Session,实在是简单到了不能再简单的地步——只要让类 MyHandler 实现 System.Web.SessionState.IRequi