ASP.NET MVC编程——路由
框架自动生成的路由配置
上图中,路由配置文件为App_Start文件夹下的RouteConfig.cs。
代码如下:
public class RouteConfig
{
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 }
);
}
}
注意:路由中的控制器和操作不区分大小写。
忽略路由
IgnoreRoute为RouteCollection 的扩展方法,作用是忽略指定样式的路由。
上面routes.IgnoreRoute("{resource}.axd/{*pathInfo}");中的{resource}代表一个路由参数,{resource}.axd代表以.axd结尾的字符串;{*pathInfo}也是一个路由参数,*代表匹配任何字符串,那么以pathInfo结尾的串都会匹配到。这条语句完整含义是:以axd结尾的任何字符串,不论斜杠后是何种字符串都不执行路由行为。
映射路由
MapRoute也是RouteCollection 的扩展方法,映射路由。
MapRoute有多个重载的方法,所有的参数含义如下:
参数名称 |
参数类型 |
注释 |
---|---|---|
name |
string |
路由名称 |
url |
string |
Url模式 |
defaults |
object |
默认路由值对象 |
constraints |
object |
一组表达式,限定URL参数值 |
namespaces |
string[] |
设置一组命名空间 |
参数解析
1)defaults设置默认的路由值对象,
2)constraints:通过正则表达式来设置约束条件
如constraints:new {id=@"d+"}限制id只能是数值类型
规则:从前到后逐段匹配,请求URL参数少于定义的URL时,默认配置补全对应的参数。
几个例子:
routes.MapRoute(
name:"",
url:"V1/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints:new {id=@"d+"}
);
3)url
{controller}/{action}/{id}
这种形式包括了三段,段指的是路由中用/隔开的部分。约定路由中的控制器和操作用controller和action表达。
段也可以包含字面值。
不允许有两个连续的段值:
例如
不允许:{controller}{action}/{id}
合法的:{language}-{current}/{controller}/{action}/{id}
多个路由的选择问题
当配置多个路由时,从上到下依次匹配,直至匹配到一个。
匹配现有文件
通过设置RouteCollection.RouteExistingFiles属性来确定是否可以匹配到现有文件。若,routes.RouteExistingFiles = false;则,禁止匹配到现有文件,只能匹配路由表里的虚拟路由。
例:
public static void RegisterRoutes(RouteCollection routes)
{
routes.RouteExistingFiles = true;
//其他配置
}
使用特性配置路由
将属性RouteAttribute 标记到控制器或控制器操作上。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public sealed class RouteAttribute : Attribute, IDirectRouteFactory, IRouteInfoProvider
使用特性的三个属性或构造函数:
public RouteAttribute(string template):template是路由匹配模式
Name:获取或设置路由名称
Order:获取或设置路由应用顺序
Template:获取路由匹配模式
URL与搜索引擎优化
1)URL越短越好
2)用破折号而不是下划线
3)使用小写字母。根据HTTP规范,URL区分大小写,一般的搜索引擎遵循HTTP规范。
使用Glimpse观察路由
安装Glimpse
地址http://getglimpse.com/Docs/#download找到所需安装命令。在网站上可以看到不只应用于MVC;这里主要是使用这个工具观察路由,所以下载MVC包。
打开VS->工具->NuGet程序包管理器->程序包管理器控制台,在控制台上输入命令:Install-Package Glimpse.MVC5,然后回车,执行安装,结果如下:
启用Glimpse
运行web应用,输入地址格式为:网站根目录/glimpse.axd,例如
http://localhost:51881/glimpse.axd,显示界面如下,点击Turn Glimpse on启动。
使用Glimpse观察
启动了Glimpse以后,输入http://localhost:51881/Home/Contact,看到下图
注意浏览器下方多了一条统计信息,从这里可以看到路由请求的相关信息,以上面输入的地址为例:
浏览器请求耗时
服务端响应耗时
点击下面的图标查看更加详细的信息
展示详细信息的界面如下所示:
从上图中可以看到配置,运行环境,模型绑定,请求,路由,服务器,时间统计等等。
扩展路由-创建自定义路由约束
继承IRouteConstraint接口,实现Match方法
public class CustomRouteConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
//实现验证
//验证通过返回true
return true;
}
}
使用约束
routes.MapRoute(
name:"CustomConstr",
url:"{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints:new {id=new CustomRouteConstraint()}
);
原理
1)首先,UrlRouteModule处理新请求,将请求URL映射到定义的路由器上。
2)若URL匹配到已定义的路由,那么创建IRouteHandler实例(默认实例为MvcRouteHandler对象)。
3)IRouteHandler返回HTTP处理器实例(默认的为MvcHandler),HTTP处理器实例负责处理请求消息。
4)HTTP处理器实例使用IControllerFactory(控制器工厂)创建对应的控制器对象。
注意:
对于1)如果请求的URL能够匹配到网站根目录下的实体文件,那么不会再匹配虚拟路由,除非通过RouteCollection.RouteExistingFiles来设置改变这一行为。
参考:
1.Jess Chadwick/Todd Snyder/Hrusikesh Panda,徐雷/徐扬
译。ASP.NET MVC4 Web编程
2.Jon Galloway/Phil Haack/Brad Wilson/K. Scott Allen,孙远帅/邹权译 ASP.NET MVC4 高级编程(第四版)
3.黄保翕,ASP.NET MVC4开发指南
4.蒋金楠,ASP.NET MVC4框架揭秘
5.https://www.asp.net/mvc
-----------------------------------------------------------------------------------------
转载与引用请注明出处。
时间仓促,水平有限,如有不当之处,欢迎指正。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- GitHub 神器:写代码、搜问题,全部都在「终端」完成!
- Redis系列:单机主从模式搭建
- Python 爬取链家成都二手房源信息 asyncio + aiohttp 异步爬虫实战
- 10 个冷门但又非常实用的 Docker 使用技巧!
- 利用 Shell 脚本实现邮件监控 Linux 系统的内存
- 拥有此神技,脚本调试从此与 echo、set、test 说分手!
- 很少用到,但掏出来让人感到牛逼的Web API
- 突击并发编程JUC系列-并发工具 CountDownLatch
- 推出 TF Lite Task Library 接口,简化 ML移动端开发流程
- 排序算法之我观
- 线性筛素数(探索中的不断优化)
- 麦森数
- 5款工具,让你轻松创建并分享优美的项目源码
- 过河卒
- 低调的 Linux 文件系统家族