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. 2016 Google中国开发者大会游记

    本文地址:http://www.cnblogs.com/likeli/p/6146117.html 写在前面 平时一直埋头写代码,这次既然Google给了门票,也就来看看,看看这种世界顶尖的科技公司, ...

  2. qtranslate

    qtranslate可以帮助用户快速的建立多语言网站平台,qTranslate 插件就是一个功能强大的 WordPress 多语言插件. 它允许用户在配置页添加新的语言.在 URL 结构方面,qTra ...

  3. Nginx - Windows下nginx定时分割日志

    1.建立批处理脚本,c:\soft\demo.bat @echo off taskkill /F /IM nginx.exe > nul cd C:\soft\nginx-1.11.3 rem ...

  4. 《DSP using MATLAB》示例Example5.22

    代码: Nmax = 2048; fft_time = zeros(1, Nmax); for n = 1:1:Nmax x=rand(1,n); t=clock; fft(x); fft_time( ...

  5. 一个神奇的POS -扫描 现场销售 开单打印票据 安卓物联网POS机 手持开单终端机 省时省力 高效准确!!

    5寸高清彩屏,高端大气上档次,小巧轻便,独特的包胶防护,坚固耐用,外形精细,美观!与软件灵活对接,解决企业手工盘点,手工输单,库存管理等困难,提高准确率,提高工作效率!! 应用领域:适用于仓库.超市. ...

  6. ASP.NET MVC3中Controller与View之间的数据传递总结

    一.  Controller向View传递数据 1.       使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...

  7. Thread与Runnable的一个小陷阱

    Java里面运行一个线程可以通过继承Thread的方式,也可以通过实现Runnable的接口来实现,那么两者能不能混用呢,比如以下的例子: public class JavaTest extends ...

  8. 在CentOS 7中安装与配置JDK8

    参考命令:http://www.jb51.net/os/RedHat/73016.html来进行安装 安装说明 系统环境:centos7 安装方式:rpm安装 软件:jdk-8u25-linux-x6 ...

  9. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  10. 【异常】No ManagedConnections available within configured blocking timeout

    Caused by: org.jboss.util.NestedSQLException: No ManagedConnections available within configured bloc ...