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:

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

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

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC 路由(三)的更多相关文章

  1. ASP.NET MVC 路由(一)

    ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...

  2. Asp.Net MVC 路由 - Asp.Net 编程 - 张子阳

    http://cache.baiducontent.com/c?m=9d78d513d98316fa03acd2294d01d6165909c7256b96c4523f8a9c12d522195646 ...

  3. AngularJS html5Mode与ASP.NET MVC路由

    AngularJS html5Mode与ASP.NET MVC路由共存 前言 很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习.前不久公司找我们部门 ...

  4. ASP.NET没有魔法——ASP.NET MVC路由

    之前的文章中介绍了My Blog文章维护功能的开发,开发过程中使用Area的方法建立了用于维护文章的Controller.View和Model.但是无论代码怎么变对于浏览器来说都是通过一个url地址去 ...

  5. 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  6. ASP.NET MVC 视图(三)

    ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...

  7. ASP.NET MVC 路由(二)

     ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...

  8. ASP.NET MVC 路由(四)

    ASP.NET MVC路由(四) 前言 在前面的篇幅中我们讲解路由系统在MVC中的运行过程以及粗略的原理,想必看过前面篇幅的朋友应该对路由有个概念性的了解了,本篇来讲解区域,在读完本篇后不会肯定的让你 ...

  9. ASP.NET MVC 路由(五)

    ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...

随机推荐

  1. 模板类 error LNK2019: 无法解析的外部符号

    如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...

  2. echarts之tooltip-position

    当postion为Array时 tooltip : { trigger: 'axis', position:[3,3] //赋予一个[x,y]的位置 } 当postion为function时 tool ...

  3. 递推+高精度 UVA 10497 Sweet Child Makes Trouble(可爱的孩子惹麻烦)

    题目链接 题意: n个物品全部乱序排列(都不在原来的位置)的方案数. 思路: dp[i]表示i个物品都乱序排序的方案数,所以状态转移方程.考虑i-1个物品乱序,放入第i个物品一定要和i-1个的其中一个 ...

  4. unity 协程

    StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使 ...

  5. 如何让eclipse进行智能提示?

    1.打开eclipse工具,点击window菜单,选择preferences选项 2.然后,选择Java->Editor->content assist 3.然后在Auto activat ...

  6. 【BFS】HDU 1495

    直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...

  7. jsp使用EL表达式回传boolean值出错的问题

    在最近做的一个项目中使用session回传的属性中有一个为boolean,报出错. 属性名字为"isAdmit",布尔类型.后来我上网查了一下,是因为我使用了Myeclipse的自 ...

  8. DB2数据库参数建议(AIX)

    修改用户最大进程数: chdev -l sys0 -a maxuproc=' 用户资源配置:对实例用户,fence用户,应用用户添加如下限制: db2inst1 : fsize=- fsize_har ...

  9. BestCoder Round 70

    惨败,不能再嘲笑别人了,否则自己也会像别人那样倒霉 HDU 5615:http://acm.hdu.edu.cn/showproblem.php?pid=5615 求ax^2+bx+c能否拆成(px+ ...

  10. 根据异常处理对 Java 方法的层次分类

    我根据异常处理对 Java 的方法分为三个层次:1.执行层,2. 处理层,3. 调用层. 执行层方法只抛出异常 throws Exception,是作为代码的基层操作者,可能有多个层次. 处理层方法使 ...