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中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...
随机推荐
- git客服端基本操作
以下操作基于git+gerrit 1.生成公钥 ssh -keygen -t rsa 默认公钥生成路径 C:\Documents and Settings\用户名\.ssh 2.配置姓名和邮箱地址 ...
- abstract与interface的区别
abstract的用法: //通过abstract 关键字修饰的类叫抽象类. abstract class Animal { String name; String color; abstract p ...
- adv
1. 对产品质量的认知理念,不仅是是确保没问题,而是通过自身与团队的价值提升产品的质量.潜在问题,竞类产品用户体验,bug产生分析图,流程控制 2. 责任心特质,正能量,热情激情,并且能感染团队成员和 ...
- JS表单前台校验模板
表单校验是几乎所有WEB应用都会用到的,这里提供一种用原生JavaScript的简单前台校验 <form id="registerForm" action="&qu ...
- IMap 对map的功能的强化
为了解决表单提交获得数据的方便性,我们将map的功能进行加强,表单提交的数据会自动将页面数据放入PageData对象中,当从页面获取数据时 new的时候要传request.request.getPar ...
- Linux中安装NodeJs 、cnpm 、npm
一.安装NodeJs 切换到 cd /usr/local/src/ 下载nodejs wget https://nodejs.org/dist/v6.9.3/node-v6.9.3-linux-x64 ...
- Codeforces Round #388 (Div. 2) - C
题目链接:http://codeforces.com/contest/749/problem/C 题意:给定一个长度为n的D/R序列,代表每个人的派别,然后进行发表意见,顺序是从1到n.每个人到他的回 ...
- OGNL的使用
访问Action中的普通属性: <s:property value="loginname"/><br/> 访问Action中的对象属性: <s:pro ...
- iOS10以上关于访问权限设置
记录一下: iOS对用户的安全和隐私的增强,在申请很多私有权限的时候都需要添加描述,但是,在使用Xcode 8之前的Xcode还是使用系统的权限通知框.要想解决这个问题,只需要在info.plist添 ...
- Jedis 使用范例
public class RedisUtil { Logger logger = LoggerFactory.getLogger(RedisUtil.class); private JedisPool ...