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

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

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

         public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}

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

  

         protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}

  

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

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

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

  

  发现了一个MapPageRoute的方法

  

         //
// 摘要:
// 提供用于定义 Web 窗体应用程序的路由的方法。
//
// 参数:
// routeName:
// 路由的名称。
//
// routeUrl:
// 路由的 URL 模式。
//
// physicalFile:
// 路由的物理 URL。
//
// 返回结果:
// 将添加到路由集合的路由。
public Route MapPageRoute(string routeName, string routeUrl, string physicalFile);

  

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

  

         // 摘要:
// 将路由添加到 System.Web.Routing.RouteCollection 对象的结尾,并为路由分配指定的名称。
//
// 参数:
// name:
// 标识路由的值。 该值可为 null 或空字符串。
//
// item:
// 要添加到集合结尾的路由。
//
// 异常:
// System.ArgumentNullException:
// item 为 null。
//
// System.ArgumentException:
// name 已在集合中使用。
public void Add(string name, RouteBase item);

  

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

  

     // 摘要:
// 用作表示 ASP.NET 路由的所有类的基类。
[TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
public abstract class RouteBase
{
// 摘要:
// 初始化该类供继承的类实例使用。 此构造函数只能由继承的类调用。
protected RouteBase(); // 摘要:
// 获取或设置一个值,该值指示 ASP.NET 路由操作是否应处理与现有文件匹配的 URL。
//
// 返回结果:
// 如果 ASP.NET 路由操作处理所有请求(甚至包括与现有文件匹配的请求),则为 true;否则为 false。 默认值为 false。
public bool RouteExistingFiles { get; set; } // 摘要:
// 当在派生类中重写时,会返回有关请求的路由信息。
//
// 参数:
// httpContext:
// 一个对象,封装有关 HTTP 请求的信息。
//
// 返回结果:
// 一个对象,包含路由定义的值(如果该路由与当前请求匹配)或 null(如果该路由与请求不匹配)。
public abstract RouteData GetRouteData(HttpContextBase httpContext);
//
// 摘要:
// 当在派生类中重写时,会检查路由是否与指定值匹配,如果匹配,则生成一个 URL,然后检索有关该路由的信息。
//
// 参数:
// requestContext:
// 一个对象,封装有关所请求的路由的信息。
//
// values:
// 一个包含路由参数的对象。
//
// 返回结果:
// 一个对象(包含生成的 URL 和有关路由的信息)或 null(如果路由与 values 不匹配)。
public abstract VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);
}

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

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

  好了,简单的Url就写就这里了,稍后会对下一步进行详解,尽请期待!

MVC中的URL路由(一)的更多相关文章

  1. 转:在ASP.NET MVC中通过URL路由实现对多语言的支持

    对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如en或者en-US)来指导服务器应该采用怎 ...

  2. Spring mvc源码url路由-我们到底能走多远系列(38)

    我们到底能走多远系列38 扯淡: 马航的事,挺震惊的.还是多多珍惜身边的人吧. 主题: Spring mvc 作为表现层的框架,整个流程是比较好理解的,毕竟我们做web开发的,最早也经常接触的就是一个 ...

  3. 白话ASP.NET MVC之一:Url 路由

    好久没有写关于ASP.NET MVC的东西了,虽然<ASP.NET MVC4框架揭秘>已经完完整整的看完一遍,但是感觉和一锅粥差不多,没什么可写的,因为我自己不理解,也就写不出来.现在开始 ...

  4. ASP.NET Core MVC 中两种路由的简单配置

    1.全局约定路由 这种方式配置优先级比较低,如果控制器或者方法上标记了特性路由那么优先走特性路由. 当建立好一个mvc项目里,路由都是默认配置好的. 如果建立的是空项目那么需要手动配置: 1.需要在C ...

  5. ASP.NET MVC中获取URL地址参数的两种写法

    一.url地址传参的第一种写法 1.通过mvc中默认的url地址书写格式:控制器/方法名/参数 2.实例:http://localhost:39270/RequestDemo/Index/88,默认参 ...

  6. MVC中如何设置路由指定默认页

    MVC中怎么设置默认页,在webform中 只要右键设置起始页就可以,但MVC中却没有这个功能,其实MVC更简单 如下: Login是控制器,Index 是动作 在全局Global.asax中改动下即 ...

  7. Django2.0中得url路由path得用法

    Django2.0中,url得匹配规则更新了,在django1.0中,url是用正则表达式书写得,相对来说比较繁琐一些,在django2.0中进行了升级优化,改为了path from django.u ...

  8. diango中的url路由系统

    一.url配置 url本质是url与要为该url调用的视图函数之间的映射表 urlpatterns = [正则,视图函数[,别名]] 二.正则表达式 1.匹配原则 django是循环urlpatter ...

  9. asp.net mvc 中通过url字符串获取controller和action

    在项目中遇到需要通过url字符串获取controller和action的情况,百度了 一下找到了一个可以用的方法 ,在这里分享和记录一下 这个方法是在博客园的博问里看到的 原文地址是http://q. ...

随机推荐

  1. 【转】MFC中用CFile读取和写入文件2

    原文网址:http://blog.sina.com.cn/s/blog_623a7fa40100hh1u.html CFile提供了一些常用的操作函数,如表1-2所示. 表1-2  CFile操作函数 ...

  2. SharePoint : 使用SPQuery对象时要注意的事项

    转:http://www.cnblogs.com/chenxizhang/archive/2009/10/23/1588415.html 我们经常需要对一个列表进行查询,此时最灵活的方式就是直接使用S ...

  3. zabbix 获取不到自定义脚本的值解决

    agent端: zabbix 自定义脚本 [root@localhost script]# cat check_ping.sh #!/bin/bash result=$(/usr/local/nagi ...

  4. cnUVA情况

    http://cn_uva.jd-app.com/ 欢迎访问

  5. IT的工作是这样?

    天若有情天亦老,人干IT死得早; 谁知盘中餐,IT老加班; 锦瑟无端五十弦, 我做PM净贴钱; 庄生晓梦迷蝴蝶, 领导客户是大爷; 沧海月明珠有泪, 吃亏受气也开会; 蓝田日暖玉生烟, 可怜人生已跑偏 ...

  6. 原来DataTable的Distinct竟如此简单![转]

    本文转自:http://www.cnblogs.com/BlueFly/archive/2009/01/08/1372151.html 有时我们需要从DataTable中抽取Distinct数据,以前 ...

  7. PC-XP系统忘记密码怎么办

    (一)以恢复本地用户"*****"口令为例,来说明解决忘记登录密码的步骤:1.重新启动计算机,在启动画面出现后马上按下F8键,选择"带命令行的安全模式".2.运 ...

  8. [C#]生成预定义全颜色表

    生成Color类所有static预定义成员的颜色表 const long CELLS_PER_LINE = 10; const float MARGIN = 12; const float CELL_ ...

  9. eclipse中的maven配置

    1.下载最新版eclipse,包含maven版本 2.配置maven本地仓库(修改settings.xml)

  10. 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段

    1.查看表空间中数据文件存储的路径以及是否可以自动扩展 SELECT TABLESPACE_NAME, BYTES/1024/1024 FILE_SIZE_MB, FILE_NAME FROM DBA ...