MVC系统学习1—MVC执行流程
2014-03-21 09:58
197 查看
用MVC来做开发也有一段时间了,但是感觉一直没入门,就徘徊在似懂非懂的层次,和去年刚毕业学习WebForm时一样,当时通过张子阳老兄的几篇文章,明白了请求处理流程,页面生命周期才真正明白了WebForm的强大。由于MVC的学习资料比较少,牛人的技术博客也只是讲一些基础的而已。因此决定通过Asp.Net MVC源码来学习,由于是开源的,也不用Reflector作为辅助工具。首先还是明白下MVC的请求处理流程。有参考了MSDN上面的文章(http://msdn.microsoft.com/zh-cn/library/dd381612.aspx)
当应用程序第一次接受请求的时候,在Global.asax文件中,Route对象会添加到RouteTable对象中。RegisterRoutes函数就是我们实现的路由注册函数。
通过MVC源码在了解上面这一步的大致实现过程 。在RegisterRoutes函数中,通过调用MapRoute(扩展方法)来实现向RouteCollection添加Route对象。最后调用的是下面的方法。
View Code
可以发现上面的方法实现创建一个Route对像,并将其添加到RouteCollection,然后将其返回。接下来了解下Route类。Route继承自RouteBase类.其有几个比较重要的属性。
上面这前三个成员的类型是RouteValueDictionary,而上面的函数中,是调用下面的这个函数来实现向Route的Defaults等添加数据。如注释,就是将controller,action,id添加到Defaults的键中,而将Home,Index加入到相应的键对应的值。而对于RouteHandler的作用等下再讲。这样就完成了一个Route对象的创建并且添加到RouteCollection中,而这个RouteCollection也就是RouteTable的成员Routes.
在Asp.Net管道中执行MVC请求的HttpModule是UrlRoutingModule模块。UrlRoutingModule使用RouteTable 集合中第一个匹配的 Route 对象来创建 RouteData 对象,然后使用所创建的对象创建 RequestContext 对象。UrlRoutingModule里面有一个RouteCollection属性,其就是通过RouteTable.Routes来实现赋值的。
在UrlRoutingModule中,注册了两个HttpApplication公开的事件。其中是在OnApplicationPostResolveRequestCache方法里面实现路由匹配,因为其里面又调用了一个this.PostResolveRequestCache(context)方法,而在这个方法里面的第一句就是 RouteData routeData = this.RouteCollection.GetRouteData(context)。根据请求上下文来获取RouteData。路由匹配的奥秘貌似就在这里。
this.RouteCollection.GetRouteData(context)方法里面最后又这么几句代码。通过遍历当前的RouteCollection来实现RouteData的获取,如果获取到则立即返回。这里其实遍历的单个对象不是RouteBase而是Route,而Route继承自RouteBase类,并且重写了RouteBase的抽象函数GetRouteData(为什么这么做,待研究?)。而路由匹配的实现也是在Route类里重写的GetRouteData方法。
Route的GetRouteData方法
最后是在这个方法下面调用ParsedRoute的Match进行路由匹配
当应用程序第一次接受请求的时候,在Global.asax文件中,Route对象会添加到RouteTable对象中。RegisterRoutes函数就是我们实现的路由注册函数。
View Code
可以发现上面的方法实现创建一个Route对像,并将其添加到RouteCollection,然后将其返回。接下来了解下Route类。Route继承自RouteBase类.其有几个比较重要的属性。
上面这前三个成员的类型是RouteValueDictionary,而上面的函数中,是调用下面的这个函数来实现向Route的Defaults等添加数据。如注释,就是将controller,action,id添加到Defaults的键中,而将Home,Index加入到相应的键对应的值。而对于RouteHandler的作用等下再讲。这样就完成了一个Route对象的创建并且添加到RouteCollection中,而这个RouteCollection也就是RouteTable的成员Routes.
public override RouteData GetRouteData(HttpContextBase httpContext) { //获取请求的虚拟路径 string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo; //TODO:接下来进行路径的匹配 RouteValueDictionary values = this._parsedRoute.Match(virtualPath, this.Defaults); if (values == null) { return null; } RouteData data = new RouteData(this, this.RouteHandler); //如果不通过约束则返回空 if (!this.ProcessConstraints(httpContext, values, RouteDirection.IncomingRequest)) { return null; } foreach (KeyValuePair<string, object> pair in values) { data.Values.Add(pair.Key, pair.Value); } if (this.DataTokens != null) { foreach (KeyValuePair<string, object> pair2 in this.DataTokens) { data.DataTokens[pair2.Key] = pair2.Value; } } return data; }
最后是在这个方法下面调用ParsedRoute的Match进行路由匹配
相关文章推荐
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- hibernate学习笔记-基本配置和执行流程
- Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
- 一个基于qt的桌面聊天系统的学习笔记(3)-文件传输模块-文件传输流程
- Yii框架学习笔记(第一天)-执行流程
- JSP系统开发学习之四关于用户登录界面的补充——通过request页面传值&wel.jsp的MVC的实现
- [Linux学习笔记] Linux系统引导流程(二)
- Python学习第2节(基本数据类型操作和执行流程语句)
- JBPM学习(四):执行流程实例
- 从浏览者访问网页的流程来看如何提高系统反应速度(2)--服务端网页的执行
- 流程企业(钢铁企业)的制造执行系统
- JavaScript系统学习之一 <基本语法,运算符,流程控制语句>
- SpringMVC学习系列之 基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现
- 《Linux内核分析》第八周学习小结 进程的切换和系统的一般执行过程
- PHP的Smarty学习之MVC运行流程
- 现代流程企业的制造执行系统
- ant学习笔记之(ant执行命令的详细参数和Ant自带的系统属性)
- 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序 (学习老罗的)
- java系统学习(二) --------java程序设计中的流程控制
- mvc执行流程