ASP.NET MVC 路由(三)

前言

通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处的位置在哪呢?

RouteData

路由系统在ASP.NETMVC框架中的默认的实现位置是在RulRoutingModule中。对于Module下个篇幅会有所讲解。

本篇主题在于说明RouteData对象,因为MVC框架在根据服务器端注册好的Route对象集合和请求的Url匹配所得一个Route对象,而在后面的框架使用中是不会对Route对象去操作的,而是封装成了RouteData对象。

我们看一下RouteData对象的构造函数定义:

         public RouteData (RouteBase route, IRouteHandler routeHandler)
         {
             
             Route = route;
             RouteHandler = routeHandler;
 
             DataTokens = new RouteValueDictionary ();
             Values = new RouteValueDictionary ();
         }

RouteBase类型的对象就是Route对象的基类,下面说明。

IRouteHandler类型的则是会使用系统默认的类型MvcRouteHandler类型,而MvcRouteHandler类型则会根据请求上下文参数对象默认的生成实现了IHttpHandler接口的MvcHandler类型,MvcHandler类型则是跟控制器部分连接的关键处,后续的篇幅会有讲解这里扯多了。

现在我们来看一下RulRoutingModule对象中获得RouteData对象的默认实现,如图1

图1

RouteData对象是要根据请求的Url来进行匹配所得到的,从图1中也可以看出,请求包含在Context参数中,而参数的对象模型也在图中有所显示,看似由RouteCollection对象来调用的GetRouteData()方法,实际是由RouteCollection对象中的(在服务器端先注册的一些Route对象)每个Route对象都来执行一遍GetRouteData()方法,如果有匹配的则会返回,没有则继续往下匹配。

RouteData对象包含着控制器名称、RouteHander对象(路由请求处理对象),有着承上启下的作用,如图2所示对象模型

图2

我们只需要关注Values属性和RouteHandler属性即可,图1中蓝色线条的箭头表示属性的类型,Values属性表示着的是请求Url通过匹配解析后的对应值,假使Route中的Url规则定义为”{controller}/{action}”,而请求的Url为”Home/Index”,这样的话Values中的Keys值集合为controller、action两项分别对应的值为Home、Index,而RouteHandler属性则是获取匹配成功的那个Route对象的RouteHandler属性。

总结:

粗略的概括路由的执行过程

  1. 向当前系统注册路由(路由名称、自定义Url规则、命名空间、以及一些Url约束等信息)

  2. 每个路由对象在注册到系统路由集合中的时候则会自动的解析完成Url规则,并由路由对象对象(Route)保存

  3. 根据请求到达服务器的时候,请求Url在服务器的路由集合(RouteCollection)中匹配(匹配的规则就是按照集合中的顺序,每个Route对象会依次的根据请求Url来根据自己的Url规则进行匹配,如果发现合适的则会结束匹配,请大家记住路由是最先匹配不是最优匹配),根据匹配好的Route对象进行封装最后返回RouteData对象实例。

下面上图两张便于大家理解记忆,有不妥的地方请大家指正。

图3

图4

Ps:

这部分的知识不会给你带来多大的提升应该是可以给你留下一点关于路由的印象。

看完这几篇并不会对路由有多么的熟悉只要是能让你有一点的收获我就心满意足了,对于路由其它的部分会在后续篇章中继续讲解。

ASP.NET MVC 学习