MVC的页面生成周期和Asp.net页面生存周期的不同点

其实这两个的页面生存周期的过程大致是一样的,唯一不同在:asp.net页面由于请求的是一个确定的.aspx页面,所以在第8个页面中就直接生成了11-12个事件时候的页面对象,但是MVC请求的不是一个确定的页面,而是一个控制器的地址,所以微软在设计的时候就在第7个事件的时候就获取到了一个页面的对象

大致原理如下:

.net4.0中web.config注册了一个默认的UrlRouteModule

在目录:c:\windows\microsoft.net\framework\v4.0\config\web.config文件中注册了UrlRoutingModule
<web.config>
<httpModules>
<add name="UrlRoutingModule-4.0" type="system.web.Routing.UrlRoutingModule"/>
<httpModules>
</web.config>
所以在Application实例初始化的时候会调用所有的Model初始化所以UrlRouteModel也会初始化

———————————————————————————————————————————————

在Application对象初始化的时候会 编译web.config文件通过反射获取到里面注册的所有的Model对象,并且递归初始化这些Model的init方法,执行init方法中注册的事件
一般的asp.net页面由于请求的是一个确定的.aspx页面,所以在第8个页面中就直接生成了11-12个事件时候的页面对象,但是MVC请求的不是一个确定的页面,所以在初始化他的UrlRoutingModule的
void Init(Application context)
{
context.PostResolveRequestCache+=new EventHandler(this.OnApplicationPostResolveRequestCache)
}
}
内部注册了第7个事件意在获取一个11-12个事件之间执行的页面对象
这个事件中
void context_PostResolveRequestCache(object sender, EventArgs e)
{
RouteData routedata=this.RouteCollection.GetRouteData(context);//根据上下文对象中的请求的Url去匹//配路由表中每一项路由规则,如果匹配到了,就取出他的路由数据,并且把匹配上的这个路由规则中的RouteHandler对象交给了路由数据中的一个Routehandler属性
IRouteHandler routehandler=routedata.RouteHandler;//由于我们在注册路由规则的时候,构造路由对象的//时候传递过去了一个RouteHandler对象,作为了路由的一个属性,所以就取出匹配了路由规则的这个
//MvcRouteHandler
IhttpHandler httphandler=routehandler.GetHttpHandler(requestcontext);//通过routehandler对象的
//GetHttpHandler方法去获取执行http请求的prhandler对象也就是在第11-12个事件之间执行的页面对象//mvcHandler
context.RemapHandler(httphandler);//将当前的请求映射到一个存在的prhandler上去,这个已存在的handler就是我们在注册路由的时候,如果你的Url匹配上了一条路由规则,后条路由规则注册的时候生成的那个MvcRoutehanler对象
}

这样执行下来后该我们带来的一个问题就是 假如客户的Url请求要是一样的话 最终在11-12个事件之间执行的执行的页面对象不就一样了吗?那么他的processrequest方法也就一样了!其实不是这样的微软已经在页面生成周期之前已经做了处理:
在11-12个事件的时候拿到第7个事件的时候创建的MVCHandler对象执行他的ProcessRequest方法,在这个方法中首先创建了controllerFactshily实例
获取到Controller实例 通过这个实例的Controller.Execute(RequestCOntext requstcontext)这个方法内部会调用ActionInvoker.InvokeActioin(controllercontext,actionname)方法执行并且返回一个ActionReuslt结果
通过ActionResult.ExecuteReuslt执行这个结果 通过FindView去搜索这个view找到这个view后通过viewRender(viewcontext,writer)进行渲染 最终生成html返回给客户 。

posted @ 2012-09-10 21:15  plugin-loader  阅读(273)  评论(0编辑  收藏  举报