第二节:各种路由约束(动态路由、静态路由、组合路由、正则约束、命名空间约束、区域内路由)...
一. 什么是路由
路由是约束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
第二节:各种路由约束(动态路由、静态路由、组合路由、正则约束、命名空间约束、区域内路由)...相关推荐
- 静态路由与动态路由的优先级_静态路由基础知识
静态路由是指由管理员手动配置和维护的路由.静态路由配置简单,并且无需像动态路由那样占用路由器的CPU资源来计算和分析路由更新. 静态路由的缺点在于,当网络拓扑发生变化时,静态路由不会自动适应拓扑改变, ...
- 7添加静态路由 hat red_不同VPC路由器通过静态路由、动态路由(OSPF)实现网络互通实战...
作者: 李朗 前言 VPC网络基本上是每个云厂商都具备的功能,不同厂家构建VPC网络的实现方式和操作步骤不尽相同,但是基本目的都是想实现一套虚拟的专有网络.VPC网络是ZStack支持的网络类型之一, ...
- 静态路由和动态路由详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.静态路由 1,默认路由 2,浮动路由 二,动态路由 一.静态路由 静态路由(Static routing),一种路由的方 ...
- 使用packet Tracer配置静态路由和动态路由
使用packet Tracer配置静态路由和动态路由(后边附有文件下载链接) 静态路由配置 动态路由配置 学习使用packet Tracer配置静态路由和动态路由.从开始到配置成功历时两天两夜. 由于 ...
- IP路由原理、静态路由及动态路由区分
IP路由原理.静态路由及动态路由区分 1.什么是路由? 2.路由的原理 3.路由来源 3.1.静态路由概述 3.1.1.静态路由配置 3.2.缺省路由/默认路由 3.3.黑洞路由 3.4.动态路由 4 ...
- 网络管理员比赛回顾02-网关、静态路由、动态路由
目录 一.配置网关 二.配置静态路由 三.配置动态路由 3.1.使用RIP协议配置动态路由 3.2.使用OSPF协议配置动态路由 2021年9月参加青年网络管理员比赛,因为网管超龄不能按照" ...
- 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )
文章目录 一.路由算法 二.路由算法 分类 三.静态路由算法 四.动态路由算法 五.动态路由算法 分类 六.分层次的路由选择协议 一.路由算法 路由算法 : 选择数传输的 "最佳路由&quo ...
- 4.2.1 路由算法与路由协议概述(静态路由和动态路由---距离-向量路由算法---链路状态路由算法、层次路由)
文章目录 0.思维导图 1.路由算法分类与路由表 2.静态路由和动态路由 3.动态路由的两种算法:链路状态路由算法和距离向量路由算法 4.层次路由 0.思维导图 1.路由算法分类与路由表 路由器转发分 ...
- 计算机网络实验(华为eNSP模拟器)——第四章 配置静态路由、动态路由
目录 前言 一.关闭泛洪信息 二.静态路由 命令 例题 三.动态路由 (一)RIP协议 RIP命令 例题 (二)OSPF协议 OSPF命令 例题(单区域) 例题(多区域) 四.查看全局路由表 结语 前 ...
- 静态路由与动态路由概念及实例
静态路由 静态路由是指由网络管理员手工配置的路由信息.当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表 中相关的静态路由信息.静态路由信息在缺省情况下是私有的,不会传递给其他的路 ...
最新文章
- Javascript年月日联动
- sob攻略超详细攻略_北海涠洲岛旅游超详细住宿攻略!!!
- javascript 将内容复制到剪贴板
- 带有AWS DynamoDB的反应式Spring Webflux
- android studio app显示红叉_发现这个 APP 后,感觉可以放弃桌面时钟了
- php表单的提交方法有什么,php – 确定哪个表单已提交的最佳方法是什么?
- Visio主题与样式
- [小笔记]TypeScript/JavaScript映射两组数据
- 常用H桥电机驱动模块L298N原理及应用
- python实现,excel随机抽取特定行到新表中(附上源码和桌面软件)
- 中国海水产品加工行业发展现状及趋势分析,山东省产量最高「图」
- 铁路cj继电器_铁路信号继电器简介讲解
- maven:mirrors和repository的关系区别
- L1-7 机工士姆斯塔迪奥 (20 分),C语言
- windows安装Nessus
- 美团再次冲击网约车市场,滴滴或将加快上市进程
- 湘潭大学计算机专业科目,湘潭大学(专业学位)计算机技术研究生考试科目和考研参考书目...
- cadence修改板框倒角_Allegro软件中如何对板框进行倒角及倒角不成功解决方法
- 数据通信初级工程师题库
- EXCEL骨灰级玩家必备技能,学会后年薪翻倍!年轻人耗子尾汁
热门文章
- 农村三资管理平台app_古劳农村“三资”管理规范化、系统化、数字化引来江门日报关注报道...
- 会话推荐和 序列推荐
- linux SCP远程拷贝文件方法及not a regular file 错误解决方法
- java多线程(2)----继承的方式创建多线程
- 什么是document对象?如何获取文档对象上的元素?_JavaScript DOM操作元素的方法,你还记得多少?...
- linux常用指令(持续更新……)
- android studio for android learning (十八) android事件监听器绑定的方法详解
- 5条线程轮流打印1~100
- java 函数式编程应用_java8 函数式编程应用
- mysql表格字放大_删除MySQL表中内容,表大小反而变大了