ASP.NET MVC 路由(三)
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属性。
总结:
粗略的概括路由的执行过程
- 向当前系统注册路由(路由名称、自定义Url规则、命名空间、以及一些Url约束等信息)
- 每个路由对象在注册到系统路由集合中的时候则会自动的解析完成Url规则,并由路由对象对象(Route)保存
- 根据请求到达服务器的时候,请求Url在服务器的路由集合(RouteCollection)中匹配(匹配的规则就是按照集合中的顺序,每个Route对象会依次的根据请求Url来根据自己的Url规则进行匹配,如果发现合适的则会结束匹配,请大家记住路由是最先匹配不是最优匹配),根据匹配好的Route对象进行封装最后返回RouteData对象实例。
下面上图两张便于大家理解记忆,有不妥的地方请大家指正。
图3

图4

Ps:
这部分的知识不会给你带来多大的提升应该是可以给你留下一点关于路由的印象。
看完这几篇并不会对路由有多么的熟悉只要是能让你有一点的收获我就心满意足了,对于路由其它的部分会在后续篇章中继续讲解。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC 路由(三)的更多相关文章
- ASP.NET MVC 路由(一)
ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...
- Asp.Net MVC 路由 - Asp.Net 编程 - 张子阳
http://cache.baiducontent.com/c?m=9d78d513d98316fa03acd2294d01d6165909c7256b96c4523f8a9c12d522195646 ...
- AngularJS html5Mode与ASP.NET MVC路由
AngularJS html5Mode与ASP.NET MVC路由共存 前言 很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习.前不久公司找我们部门 ...
- ASP.NET没有魔法——ASP.NET MVC路由
之前的文章中介绍了My Blog文章维护功能的开发,开发过程中使用Area的方法建立了用于维护文章的Controller.View和Model.但是无论代码怎么变对于浏览器来说都是通过一个url地址去 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- ASP.NET MVC 视图(三)
ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...
- ASP.NET MVC 路由(二)
ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...
- ASP.NET MVC 路由(四)
ASP.NET MVC路由(四) 前言 在前面的篇幅中我们讲解路由系统在MVC中的运行过程以及粗略的原理,想必看过前面篇幅的朋友应该对路由有个概念性的了解了,本篇来讲解区域,在读完本篇后不会肯定的让你 ...
- ASP.NET MVC 路由(五)
ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...
随机推荐
- oracle普通表转分区表(在线重定义方式)
1.1.TAB_TAOBAO_BILL 1.1.1检查下这张表是否可以在线重定义,无报错表示可以,报错会给出错误信息: exec dbms_redefinition.can_redef_table(' ...
- Andriod学习笔记2:“Your content must have a ListView whose id attribute is 'android.R.id.list'”问题的解决办法
问题描述 activity_main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <Lin ...
- OpenCV 人脸识别 C++实例代码
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include & ...
- UWP Composition API - GroupListView(一)
需求: 光看标题大家肯定不知道是什么东西,先上效果图: 这不就是ListView的Group效果吗?? 看上去是的.但是请听完需求.1.Group中的集合需要支持增量加载ISupportIncreme ...
- hellocharts包的使用心得
首先将jar包导入Libs里面然后add进入于activity中调用 xml中加入布局 <lecho.lib.hellocharts.view.LineChartView android:id= ...
- 技能收获与C语言学习
你有什么技能比大多人(超过90%以上)更好? 我会的东西很多,喜欢的东西太多,但是很遗憾广而不专,会而不精.学了很多东西我都是为了娱乐,因为以前我们那里过于强调学习,很多爱好也都被扼杀在摇篮里.我觉得 ...
- [转]svn 回退/更新/取消至某个版本命令详解
1. 取消Add/Delete 取消文件 svn revert 文件名 取消目录 svn revert --depth=infinity 目录名 2. 回退版本 方法1: 用svn merge 1) ...
- c#接口与抽象类的区别
abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的: 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误.虽然一些变量和值在编 ...
- 【原】iOS学习之NSDate在项目中的一些类目扩展
在项目中,我们可能会面对各种各样的对于时间的需求,在这里提供几种可能会用到的需求代码 1.与今天的时间做比较,返回日期差值 代码: - (NSInteger)compareWithToday { NS ...
- 浅谈我对 jQuery 的了解
总述 0 获取 jQuery 对象 1 对象跳转 2 方法调用 3 常用API 4 $(…); 5 jQuery 对象获取 6 Data 相关方法 7 选择器 8 基本的过滤器 9 内容过滤选择器 1 ...