URL路由系统通过对请求地址进行解析从而得到以目标Controller名称为核心的路由数据。Url路由系统最初是为了实现请求url与物理文件路径分离而建立的,MVC的Url Route是将Url地址与物理文件映射转移到了目标Controller的映射。

Url路由不是ASP.NET MVC特有的,而是建立在ASP.NET上面的,MVC的只是对这个路由的拓展使用(asp.net也开始使用这拓展了)。

  我们在App_Start文件夹中找到RouteConfig.cs的文件,打开看

 1         public static void RegisterRoutes(RouteCollection routes)
 2         {
 3             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 4
 5             routes.MapRoute(
 6                 name: "Default",
 7                 url: "{controller}/{action}/{id}",
 8                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
 9             );
10         }

  大体可以猜出什么意思,url那一栏地址中第一个是controller,第二个是action,第三个是参数id,defaults是默认的参数,然后在Global.asax对该路由进行注册。

  

1         protected void Application_Start()
2         {
3             AreaRegistration.RegisterAllAreas();
4             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
5             RouteConfig.RegisterRoutes(RouteTable.Routes);
6             BundleConfig.RegisterBundles(BundleTable.Bundles);
7         }

  

  简单来说路由的任务:检查请求的URL,找出当前请求的是哪个controller中的哪个action,并且有无带了什么参数过来。

  那好,我们来分析一下请求一个地址的时候,路由系统发生了什么事情?我们先来大胆的猜一下:类似于网络设备的路由器,它会有一个路由表,根据我们配置的规则对端口过来的数据进行转发,这张表里就记录了匹配规则跟处理的程序,当一个数据包过来的时候,去这张表里面寻找所相应的发送地址,找到的话路由系统就将这数据包发往哪个对应的地址里面。

  按照上面逻辑的话,我们先来找找匹配的规则在哪里加上来的,我们在上面的静态方法里面看到有一个RouteCollection的东西,进去看看里面有啥?

  

  发现了一个MapPageRoute的方法

  

 1         //
 2         // 摘要:
 3         //     提供用于定义 Web 窗体应用程序的路由的方法。
 4         //
 5         // 参数:
 6         //   routeName:
 7         //     路由的名称。
 8         //
 9         //   routeUrl:
10         //     路由的 URL 模式。
11         //
12         //   physicalFile:
13         //     路由的物理 URL。
14         //
15         // 返回结果:
16         //     将添加到路由集合的路由。
17         public Route MapPageRoute(string routeName, string routeUrl, string physicalFile);

  

  可以看到我们调用RouteCollection的MapPageRoute方法将某个物理文件路径映射到一个URL模板上,这个过程其实就是基于指定的url模板创建一个路由对象,并且将他添加到这个全局路由表中,那程序是在哪里有个Add的入口呢?不小心在RouteCollection里面发现了一个Add的方法

  

 1         // 摘要:
 2         //     将路由添加到 System.Web.Routing.RouteCollection 对象的结尾,并为路由分配指定的名称。
 3         //
 4         // 参数:
 5         //   name:
 6         //     标识路由的值。 该值可为 null 或空字符串。
 7         //
 8         //   item:
 9         //     要添加到集合结尾的路由。
10         //
11         // 异常:
12         //   System.ArgumentNullException:
13         //     item 为 null。
14         //
15         //   System.ArgumentException:
16         //     name 已在集合中使用。
17         public void Add(string name, RouteBase item);

  

  可以看到这里添加了一个Routebase的东西,我们点击去看看是什么来头?

  

 1     // 摘要:
 2     //     用作表示 ASP.NET 路由的所有类的基类。
 3     [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
 4     public abstract class RouteBase
 5     {
 6         // 摘要:
 7         //     初始化该类供继承的类实例使用。 此构造函数只能由继承的类调用。
 8         protected RouteBase();
 9
10         // 摘要:
11         //     获取或设置一个值,该值指示 ASP.NET 路由操作是否应处理与现有文件匹配的 URL。
12         //
13         // 返回结果:
14         //     如果 ASP.NET 路由操作处理所有请求(甚至包括与现有文件匹配的请求),则为 true;否则为 false。 默认值为 false。
15         public bool RouteExistingFiles { get; set; }
16
17         // 摘要:
18         //     当在派生类中重写时,会返回有关请求的路由信息。
19         //
20         // 参数:
21         //   httpContext:
22         //     一个对象,封装有关 HTTP 请求的信息。
23         //
24         // 返回结果:
25         //     一个对象,包含路由定义的值(如果该路由与当前请求匹配)或 null(如果该路由与请求不匹配)。
26         public abstract RouteData GetRouteData(HttpContextBase httpContext);
27         //
28         // 摘要:
29         //     当在派生类中重写时,会检查路由是否与指定值匹配,如果匹配,则生成一个 URL,然后检索有关该路由的信息。
30         //
31         // 参数:
32         //   requestContext:
33         //     一个对象,封装有关所请求的路由的信息。
34         //
35         //   values:
36         //     一个包含路由参数的对象。
37         //
38         // 返回结果:
39         //     一个对象(包含生成的 URL 和有关路由的信息)或 null(如果路由与 values 不匹配)。
40         public abstract VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);
41     }

  我们看到了两个抽象方法:GetRouteData与GetVirtualPath,当一个请求过来的时候,它们都会去根据URL模板的模式与代表请求地址的URL地址进行匹配,如果匹配失败返回null,成功的话,GetRouteData会得到一个封装了路由信息的RouteData对象,而GetVirtualPath则会生成一个URL,该URL被封装成VirtualPathData对象进行返回。

  那通过以上猜测,我们知道了路由系统物理文件路径添加到一个全局的路由表中,并传入给定的参数调用同名方法去找到一个与指定请求URL相匹配的路由对象,并返回相应的RouteData和VirtualPathData对象。

(转)MVC 路由的更多相关文章

  1. ASP.NET MVC 路由(一)

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

  2. ASP.NET MVC 路由(二)

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

  3. ASP.NET MVC 路由(三)

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

  4. ASP.NET MVC 路由(四)

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

  5. ASP.NET MVC 路由(五)

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

  6. MVC路由探寻,涉及路由的惯例、自定义片段变量、约束、生成链接和URL等

    引子 在了解MVC路由之前,必须了解的概念是"片段".片段是指除主机名和查询字符串以外的.以"/"分隔的各个部分.比如,在http://site.com/Hom ...

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

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

  8. ASP.NET MVC 路由进阶(之二)--自定义路由约束

    3.自定义路由约束 什么叫自定义路由约束呢?假如路由格式为archive/{year}/{month}/{day},其中year,month,day是有约束条件的,必须是数字,而且有一定范围. 这时候 ...

  9. 自定义MVC路由配置

    首先我用MVC4新增一个订单查看的功能 1.创建控制器OrderController namespace MvcApplication3.Controllers { public class Orde ...

  10. AngularJS html5Mode与ASP.NET MVC路由

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

随机推荐

  1. CSS排版页面

    创建CSS文件如下: @charset "utf-8"; /* CSS Document */ *{ margin:0px; padding:0px; border:0px; } ...

  2. php 半角与全角相关的正则

    半角的全部确认,带小初音的确认法则 ^[ア-ン゙゚ァ-ョッヲー -]+$ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset// ...

  3. 滚动效果,marquee便签

    语法: <marquee></marquee> 例子: <marquee><font size=+3 color=red>Hello, World< ...

  4. 7z 压缩命令行工具

    命令行压缩解压一 7z 1) 简介7z,全称7-Zip, 是一款开源软件.是目前公认的压缩比例最大的压缩解压软件.主页:http://www.7-zip.org/中文主页:http://7z.spar ...

  5. IIS本地部署项目出错

    今天,打开部署在本地IIS的项目发现出错了.报的错,跟没有连接网络一样的.我当时有点懵,过一会儿再静下心来,想想这是什么原因. 第一步,把所有部署的项目,都打开看了一下,方便找出对比. 发现,绑定了I ...

  6. 解决weblogic与系统时间相差8小时的问题

    解决weblogic与系统时间相差8小时的问题 在一般情况下weblogic与系统时间是很少会出现时间差的问题,但有可能在某一特定的情况下就会出现,如使用weblogic8版本时可能会出现时差问题: ...

  7. 三步走起 提升 iOS 审核通过率 下篇

    根据2015年的数据统计情况,并结合<苹果应用商店审核指南>,互娱 iOS 预审组通过细分将预审工作划为3大模块:客户端资源检查.应用内容检查和提审资源检查. 在上一篇文章中,Bugly ...

  8. Vim自动补全神器:YouCompleteMe(转)

    转自:http://blog.jobbole.com/58978/ 可能会有一段时间写linxu,免不了用vim,留着,找时间实操之 原文出处: marchtea 的博客 第一次听说这个插件还是在偶然 ...

  9. WorkerScript QML Type

    官方描述:在一个Qt Quick应用程序中可以使用线程了. Import Statement:     import QtQuick .属性:source : url信号:message(jsobje ...

  10. Python核心编程2第四章课后练习

    4-1 Python 对象.与所有 Python 对象有关的三个属性是什么?请简单的描述一下.      身份:对象的唯一标识      类型 :对象的类型决定了该对象可以保存什么类型的值       ...