ASP.NET MVC的应用程序生命周期还是跟原来ASP.NET WebForm一样没有区别,只是引入MVC后,加了一个UrlRoutingModule模块,该模块用来捕获应用程序生命周期中的PostResolveRequestCache事件,当事件触发时然后选择合适的IHttpHandler来处理请求

那是如何获取IHttpHandler的呢,我们在Global.asax的Application_Start事件中写routes.MapRoute注册路由时,会给路由对象Route创建一个MvcRouteHandler,该对象调用GetHttpHandler方法返回MvcHandler 对象用来处理接下来的操作。我们看到这个处理程序已经不是原来WebForm时的Page了。

获取完IHttpHandler后应用程序生命周期继续往下执行,经过一些事件后最后终于触发了CallHandlerExecutionStep,也就是之前创建的MvcHandler开始要接手处理了,它将会完成接下来的控制器方法执行,以及视图查找和呈现,核心东西都在这里了,所以要好好来分析下。

MvcHandler是一个IHttpAsyncHandler,它是一个异步的,因此它不是执行ProcessRequest方法了,取而代之的是BeginProcessRequest和EndProcessRequest方法。在BeginProcessRequest内部通过调用RequestContext.RouteData获取controller控制器的名字,接下来ControllerFactory根据前面获取的控制器名称来创建controller实例。

接下来MvcHandler执行EndProcessRequest方法,controller实例调用Execute方法,内部通过另一个方法ExecuteCore执行核心操作。该方法中包含了很多的执行步骤,首先调用PossiblyLoadTempData(),控制器上下文ControllerContext判断当前请求是否IsChildAction来决定是否加载TempData数据,如果是ChildAction则不加载。

然后RouteData 获取当前Action的方法名,ControllerActionInvoker调用InvokeAction方法,在InvokeAction方法中执行我们在Controller中定义的方法,执行方法的前后后我们可以注册过滤器,以让我们在执行action的前后做一些自己想做的事情。所以第一步要做的是获取所有注册过滤器,这些过滤器信息获取后存在一个叫FilterInfo对象中,其中包含了AuthorizationFilters,ActionFilters,ResultFilters ,接下来调用方法GetParameterValues(controllerContext, actionDescriptor)来获取action的参数。

调用InvokeActionMethodWithFilters方法执行action和actionfilters,这顺序一般是OnActionExecuting->ActionMethod->OnActionExecuted。这边主要讲ActionMethod方法因为它才真正代表了我们Controller中那些Action所执行的代码。获取Action参数值,封装ActionMethodDispatcher里面包含我们要执行的action的MethodInfo信息,ActionMethodDispatcher  执行Execute进而进入到action的执行,当执行完action通常返回一个ActionResult 这里我们让其返回一个ViewResult(ActionResult的一个子类),当然还有其他ActionResult ,譬如JsonResult,JavaScriptResult,FileResult,EmptyResult等等,而ViewResult 表示我们要向客户端呈现的是一个视图,通常是我们在Views文件夹下建的那些.aspx文件,当然不一定是.aspx,不同的视图引擎实现不一样。当我们写下return View()即表示返回一个ViewResult ,内部调用的是重载的方法View(string viewName, string masterName, object model)方法,你也可以直接调用该方法,顺便传入视图名等其他信息,调用new ViewResult{iewName = viewName,  MasterName = masterName, ViewData = ViewData, TempData = TempData},然后返回该对象。执行完ActionMethod后来个OnActionExecuted操作收尾。

调用InvokeActionResultWithFilters方法执行result和resultfilters,这顺序一般是OnResultExecuting->ResultExecut->OnResultExecuted。这边主要讲ResultExecut因为它涉及到视图的查找与呈现,其中视图的呈现类似原来WebForm下Page的执行过程。

调用ViewResult 的FindView方法查找视图。内部通过ViewEngineCollection   的FindView来实现。ViewEngineCollection 是一个视图引擎的集合,在MVC3中包含了两个视图引擎WebFormViewEngine和RazorViewEngine, 查找的过程会先获取Controller的名称,然后结合ViewName,找到视图所在的路径字符串,创建一个View对象,其中属性
ViewPath即为之前找到的视图路径,接着创建ViewEngineResult   对象,将View对象赋给ViewResult的View属性,执行View.Render呈现视图,根据ViewPathViewPath获取视图实例(Page对象),执行Page对象的ProcessRequest方法,这个我想大家都很熟悉了吧,哈哈。

最后释放视图,退出ResultExecute,这样视图的呈现就结束了。

执行OnResultExecuted。调用PossiblySaveTempData保存TempData数据。到这里Controller就执行完成了,退出ExecuteExecute方法,释放Cotroller对象。然后退出MvcHandler的执行,继续应用程序生命周期接下来的那些事件。

转载于:https://www.cnblogs.com/fuyun2000/archive/2013/04/27/3046153.html

ASP.NET MVC笔记相关推荐

  1. ASP.NET MVC 笔记

    (从今天开始,还是换回默认的代码高亮插件吧...话说此篇仅供个人遗忘后查阅,木有详尽解释...) 1.Controller中的所有Action方法不限制返回值类型,返回值应该至少可以被ToString ...

  2. 《Pro ASP.NET MVC 3 Framework》学习笔记之十七【示例项目SportsStore】

    接下来是关于SportsStore的后台管理功能,也就是通常的CRUD操作. 首先添加一个AdminController,代码如下: View Code using System.Web.Mvc; u ...

  3. 《Pro ASP.NET MVC 3 Framework》学习笔记之九【Ninject的使用-下】

    接着上次的Ninject的笔记,如果你是初次路过,可以先看看我前面的笔记. 一,创建依赖链(Chains of Dependency) 当我们向Ninject请求创建一个类型时,Ninject会去检查 ...

  4. 《Pro ASP.NET MVC 3 Framework》学习笔记之五【依赖注入及ninject工具使用】

    一,创建松耦合的组件 1."分解关注点"是MVC模式里面一个非常重要的特性.我们想要在应用程序里面创建的组件尽可能的独立,这样我们就能管理比较少的依赖关系.理想情况下,每个组件都是 ...

  5. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    http://blog.jobbole.com/85008/ ASP.Net MVC开发基础学习笔记(5):区域.模板页与WebAPI初步 2015/03/17 · IT技术 · .Net, Asp. ...

  6. ASP.NET+MVC+使用+Log4net+记录日志笔记

    前言: 记录系统中的日志,是一个好的项目产品必备的一个环节.每一个产品最终的目的都是要交予客户使用,因为程序员代码的开发水平参差不齐,Bug就成为了项目运维成本最大的因素之一.如何降低项目运维的成本呢 ...

  7. 《Pro ASP.NET MVC 3 Framework》学习笔记之四【领域模型介绍】

    主题:应用领域驱动开发(Applying Domain-Driven Development) Domain Model是MVC程序的"心脏",其他的一切,包括Controller ...

  8. ASP.NET MVC 2 学习笔记二: 表单的灵活提交

    ASP.NET MVC 2 学习笔记二:  表单的灵活提交 前面说到有做到公司内部的一个请假系统,用的是ASP.NET MVC 2+Entity Framework.虽然EF(Entity Frame ...

  9. ASP.NET MVC 1.0 学习笔记(随时更新)

    2011-05-03 作者注:现在已经MVC3.0了,本帖不再更新.请参考本人在asp.net: MVC.Razor 分类中的新文章. 本文是电子书ASP.NET MVC 1.0的学习笔记,记录了阅读 ...

最新文章

  1. 多位博士毕业去了985/211/三四流高校,后来怎么样了?
  2. 人工智能科普|自然语言处理(NLP)
  3. 添加mysql引擎错误
  4. java url 上传文件_Java使用HttpURLConnection上传文件(转)
  5. hbuilder版本更新失败_初试vue-cli使用HBuilderx打包app的坑
  6. golang 对象 struct 类型转json
  7. mysql error 1114,mysql error 1114 table is full 处理分享
  8. python中+=和=+的区别
  9. python不等于_Python小课堂|注释+运算符
  10. 计算机组成原理疑难知识点
  11. 如何获取 Instagram 视频以及图片
  12. 腾讯笔试题:纸牌游戏
  13. 实用android 代码,Android 实用代码七段(一)
  14. 很厉害的 SQL函数Group_concat用法,
  15. nginx端口映射配置(Windows)
  16. 《围城》读后感:你的心是一座城,愿你城中有幸福
  17. Android 查看内存命令总结
  18. 外链html怎么添加,网站外链添加如何来做,要注意这些原则
  19. 火狐浏览器获取event
  20. linux系统安装jdk8详细教程

热门文章

  1. 【引用】JS刷新当前页面
  2. 简单的问题和复杂的问题
  3. 杭电多校(五)2019.08.05--暑假集训
  4. LeetCode12- 整数转罗马数字
  5. shell脚本自动化部署服务
  6. PowerDesigner使用方法入门学习
  7. linux下踢出已登录用户
  8. 如何创建字符串(OC)
  9. 【转】解决IIS 用localhost需要用户名密码!
  10. windows sybase bit显示勾_micro:bit怎么玩?只需5个简单步骤,光速上手