一. 什么是路由

  路由是约束URL的一组规范,那么什么是URL呢?通俗的来说URL是一个地址,通过该地址,用户可以访问Web网站或者下载服务器上的文件。

    比如下面就是两组URL:

    http://www.cnblogs.com/yaopengfei/p/7828441.html

    http://www.cnblogs.com/yaopengfei/p/7828441

  显然我们喜欢第二组,省略.html,会使该地址看起来更加简洁,更加友好,利于SEO优化。

  那么我们怎么实现这个简单的需求呢?

  答案是:通过【路由】配置,所以现在我们似乎有点清晰了,路由可以规定URL的特殊格式,使其达到特殊效果。

  在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法中,执行相应操作,并接受URL中传过来的参数,在MVC5框架中,在【RouteConfig.cs】类中进行路由规则的配置,如下图:

    

二. 从源码的角度分析路由

  我们进入【RouteConfig】类中,发现核心代码是调用【RouteCollection】类下的MapRoute方法,F12看源码得知,MapRoute方法是RouteCollectionExtensions类的给【RouteCollection】类扩展方法的方法,并且有多个重载,如下图:

  下面分析一下参数的含义:

    (1) name:  要映射的路由的名称。

    (2) url:  路由的 URL 模式,可以自定义路由的格式,可以写静态路由,也可以写动态路由、组合路由等。

    (3) defaults:  一个包含默认路由值的对象,书写路由的默认值。

    (4) constraints: 一组表达式,可以使用正则指定 url 参数值的约束。

    (5) namespaces: 应用程序的一组命名空间,可以缩小检索路由对象匹配的范围。

  底层源码,有兴趣可以看一下:

 1  public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
 2         {
 3             if (routes == null)
 4             {
 5                 throw new ArgumentNullException("routes");
 6             }
 7             if (url == null)
 8             {
 9                 throw new ArgumentNullException("url");
10             }
11             Route route = new Route(url, new MvcRouteHandler()) {
12                 Defaults = CreateRouteValueDictionaryUncached(defaults),
13                 Constraints = CreateRouteValueDictionaryUncached(constraints),
14                 DataTokens = new RouteValueDictionary()
15             };
16             ConstraintValidation.Validate(route);
17             if ((namespaces != null) && (namespaces.Length > 0))
18             {
19                 route.DataTokens["Namespaces"] = namespaces;
20             }
21             routes.Add(name, route);
22             return route;

三. MVC中的几类路由及其规则

1. 动态路由

1        routes.MapRoute(
2                 name: "Default",    //路由名称
3                 url: "{controller}/{action}/{id}",   //路由规则
4                 defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional }  //默认值,当Controller或action为空(省略)的时候调用
5             );

分析:路由规则为 {controller}/{action}/{id} ,其中 {controller}、{action}、{id}为三个参数,/ 为格式分割符号,defaults中声明的是默认路由,所以下面的测试结果:

http://localhost:7559/

http://localhost:7559/First

http://localhost:7559/First/index1

http://localhost:7559/First/Index1/2

都会跳转到Index1的页面。

  变种:将上面的代码的URL分割符号稍微调整一下

1        routes.MapRoute(
2                name: "Default9",    //路由名称
3                url: "{controller}/{action}-{id}",   //路由规则
4                defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional }  //默认值,当Controller或action为空(省略)的时候调用
5            );

  请求地址就变成了:

http://localhost:7559/                                               【无法访问】

http://localhost:7559/First                                        【404找不到】

http://localhost:7559/First/index1                            【404找不到】

http://localhost:7559/First/Index1-1                         【可以访问】

2. 静态路由

1         routes.MapRoute(
2                 name: "Default2",    //路由名称
3                 url: "Ypf",   //路由规则,不区分大小写,当输入“ypf”时,会自动跳转到下面的地址
4                 defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional }  //默认值,当Controller或action为空的时候调用
5             );

静态路由:url中是一个静态值,访问的URL只有输入这个静态值,才能访问下面default中的默认值。

测试地址如下:

http://localhost:7559/                                            【无法访问】

http://localhost:7559/ypf                                      【 跳转到index1页面】

http://localhost:7559/First/index1                       【无法访问】

补充一下:MapRoute方法是可以不需要写参数名的,就像正常的调用方法一样,所以上面的代码可以改写:

1             routes.MapRoute(
2                 "Default3",    //路由名称
3                 "Ypf",   //路由规则,不区分大小写,当输入“Ypf”时,会自动跳转到下面的地址
4                  new { controller = "First", action = "Index1", id = UrlParameter.Optional }  //默认值,当Controller或action为空的时候调用
5             );

3. 组合路由

1       routes.MapRoute(
2              "Default4",    //路由名称
3              "Ypf/{action}",   //路由规则,不区分大小写,规则相符的时候,会自动跳转到下面的地址
4               new { controller = "First", action = "Index1" }
5          );

所谓的组合路由,就是静态路由和动态路由相互组合使用,测试地址如下:

  http://localhost:7559/             【无法访问】       (分析:因为不满足路由规则,没有输入ypf)

  http://localhost:7559/ypf              【 跳转到index1页面】

  http://localhost:7559/ypf/index1             【 跳转到index1页面】

  http://localhost:7559/Ypf/hh              【404找不到】        (满足路由规则,但是没有hh这个action,所以404)

  http://localhost:7559/ypf/First/index1       【404找不到】        (满足路由规则,但这里把First当做action,并没有这个action,所以404)

4. 正则约束

1        routes.MapRoute(
2                "Default5",
3                 "{controller}/{action}_{Year}_{Month}_{Day}",
4                 new { controller = "First", action = "Index1", id = UrlParameter.Optional },
5                 new { Year = @"^\d{4}", Month = @"\d{2}", Day = @"\d{2}" }
6             );//正则路由

所谓的正则约束,是指可以对URL中的参数使用正则表达式进行约束,上述代码约束了Year必须是四位数字,Month和Day必须是两位数字。

测试地址:

  http://localhost:7559/first/index1_2018_09_01         【跳转到index1页面】

  http://localhost:7559/first/index1         【无法访问】       (分析:因为不满足路由规则,没有输入{Year}_{Month}_{Day} 的参数)

  http://localhost:7559/first/            【无法访问】       (分析:因为不满足路由规则,没有输入{Year}_{Month}_{Day} 的参数)

  http://localhost:7559/                【无法访问】        (分析:因为不满足路由规则,没有输入{Year}_{Month}_{Day} 的参数)

5. 命名空间约束

1         routes.MapRoute(
2                  name: "Default6",
3                  url: "{controller}/{action}/{id}",
4                  defaults: new { controller = "Third", action = "Index", id = UrlParameter.Optional },
5                  namespaces: new string[] { "Ypf.MVC5" }
6             );

所谓的命名空间约束,即限定匹配范围路由的检索范围,提高检索速度。

特别注意:不能从外层控制器直接跳转到内层Area内的控制器!!

测试地址:以下三个访问地址,都会跳转到index1页面

  http://localhost:7559/

  http://localhost:7559/First

  http://localhost:7559/First/index1

6. Area区域内的路由

 1    public override void RegisterArea(AreaRegistrationContext context)
 2         {
 3             //原路由
 4             //context.MapRoute(
 5             //    "TestOne_default",
 6             //    "TestOne/{controller}/{action}/{id}",
 7             //    new { action = "Index", id = UrlParameter.Optional }
 8             //);
 9
10             //结合命名空间进行路由改造
11             context.MapRoute(
12                this.AreaName + "_default",
13                this.AreaName + "/{controller}/{action}/{id}",
14                new { area = this.AreaName, controller = "Sys_Admin", action = "Index", id = UrlParameter.Optional },
15                new string[] { "Ypf.MVC5.Areas." + this.AreaName + ".Controllers" }
16            );
17
18         }

  指MVC5框架中Area区域单独的一套路由规则,我们可以结合区域内的原路由,进行改造一番,如上述代码。

转载于:https://www.cnblogs.com/yaopengfei/p/7885597.html

第二节:各种路由约束(动态路由、静态路由、组合路由、正则约束、命名空间约束、区域内路由)...相关推荐

  1. 静态路由与动态路由的优先级_静态路由基础知识

    静态路由是指由管理员手动配置和维护的路由.静态路由配置简单,并且无需像动态路由那样占用路由器的CPU资源来计算和分析路由更新. 静态路由的缺点在于,当网络拓扑发生变化时,静态路由不会自动适应拓扑改变, ...

  2. 7添加静态路由 hat red_不同VPC路由器通过静态路由、动态路由(OSPF)实现网络互通实战...

    作者: 李朗 前言 VPC网络基本上是每个云厂商都具备的功能,不同厂家构建VPC网络的实现方式和操作步骤不尽相同,但是基本目的都是想实现一套虚拟的专有网络.VPC网络是ZStack支持的网络类型之一, ...

  3. 静态路由和动态路由详解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.静态路由 1,默认路由 2,浮动路由 二,动态路由 一.静态路由 静态路由(Static routing),一种路由的方 ...

  4. 使用packet Tracer配置静态路由和动态路由

    使用packet Tracer配置静态路由和动态路由(后边附有文件下载链接) 静态路由配置 动态路由配置 学习使用packet Tracer配置静态路由和动态路由.从开始到配置成功历时两天两夜. 由于 ...

  5. IP路由原理、静态路由及动态路由区分

    IP路由原理.静态路由及动态路由区分 1.什么是路由? 2.路由的原理 3.路由来源 3.1.静态路由概述 3.1.1.静态路由配置 3.2.缺省路由/默认路由 3.3.黑洞路由 3.4.动态路由 4 ...

  6. 网络管理员比赛回顾02-网关、静态路由、动态路由

    目录 一.配置网关 二.配置静态路由 三.配置动态路由 3.1.使用RIP协议配置动态路由 3.2.使用OSPF协议配置动态路由 2021年9月参加青年网络管理员比赛,因为网管超龄不能按照" ...

  7. 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )

    文章目录 一.路由算法 二.路由算法 分类 三.静态路由算法 四.动态路由算法 五.动态路由算法 分类 六.分层次的路由选择协议 一.路由算法 路由算法 : 选择数传输的 "最佳路由&quo ...

  8. 4.2.1 路由算法与路由协议概述(静态路由和动态路由---距离-向量路由算法---链路状态路由算法、层次路由)

    文章目录 0.思维导图 1.路由算法分类与路由表 2.静态路由和动态路由 3.动态路由的两种算法:链路状态路由算法和距离向量路由算法 4.层次路由 0.思维导图 1.路由算法分类与路由表 路由器转发分 ...

  9. 计算机网络实验(华为eNSP模拟器)——第四章 配置静态路由、动态路由

    目录 前言 一.关闭泛洪信息 二.静态路由 命令 例题 三.动态路由 (一)RIP协议 RIP命令 例题 (二)OSPF协议 OSPF命令 例题(单区域) 例题(多区域) 四.查看全局路由表 结语 前 ...

  10. 静态路由与动态路由概念及实例

    静态路由 静态路由是指由网络管理员手工配置的路由信息.当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表 中相关的静态路由信息.静态路由信息在缺省情况下是私有的,不会传递给其他的路 ...

最新文章

  1. Javascript年月日联动
  2. sob攻略超详细攻略_北海涠洲岛旅游超详细住宿攻略!!!
  3. javascript 将内容复制到剪贴板
  4. 带有AWS DynamoDB的反应式Spring Webflux
  5. android studio app显示红叉_发现这个 APP 后,感觉可以放弃桌面时钟了
  6. php表单的提交方法有什么,php – 确定哪个表单已提交的最佳方法是什么?
  7. Visio主题与样式
  8. [小笔记]TypeScript/JavaScript映射两组数据
  9. 常用H桥电机驱动模块L298N原理及应用
  10. python实现,excel随机抽取特定行到新表中(附上源码和桌面软件)
  11. 中国海水产品加工行业发展现状及趋势分析,山东省产量最高「图」
  12. 铁路cj继电器_铁路信号继电器简介讲解
  13. maven:mirrors和repository的关系区别
  14. L1-7 机工士姆斯塔迪奥 (20 分),C语言
  15. windows安装Nessus
  16. 美团再次冲击网约车市场,滴滴或将加快上市进程
  17. 湘潭大学计算机专业科目,湘潭大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  18. cadence修改板框倒角_Allegro软件中如何对板框进行倒角及倒角不成功解决方法
  19. 数据通信初级工程师题库
  20. EXCEL骨灰级玩家必备技能,学会后年薪翻倍!年轻人耗子尾汁

热门文章

  1. 农村三资管理平台app_古劳农村“三资”管理规范化、系统化、数字化引来江门日报关注报道...
  2. 会话推荐和 序列推荐
  3. linux SCP远程拷贝文件方法及not a regular file 错误解决方法
  4. java多线程(2)----继承的方式创建多线程
  5. 什么是document对象?如何获取文档对象上的元素?_JavaScript DOM操作元素的方法,你还记得多少?...
  6. linux常用指令(持续更新……)
  7. android studio for android learning (十八) android事件监听器绑定的方法详解
  8. 5条线程轮流打印1~100
  9. java 函数式编程应用_java8 函数式编程应用
  10. mysql表格字放大_删除MySQL表中内容,表大小反而变大了