一. 什么 UrlRouting?
用来配置一些URL的映射,使用户可以按你的规则来访问网站.,大家都称它为 url 路由,那我们就把它叫做路由器吧
使用UrlRouting,一定要规定URL模式,它包括一个位置标识,它将在你请求网页时按这个规则返回给你内容. 当然,这个创建的规则完全是由你自己定义的。
如我们在上网的时候常见到http://localhost/admin 之类的地址,后面没有接具体的页面,但实际上还是有内容返回给你看的。这就是传说中的伪静态!
二. UrlRouting的优点和缺点
优点: 可以隐藏你的真实页面,让别人找不到,安全!提高seo优化效果。
缺点: 里面的规则是需要自己定制,搞不好就系统崩溃。不利于调试。
三. UrlRouting 的规则写在哪里
1. 在 global.asax 全局文件里面
2. 在 web.config 里面进行设置
3. 在另外的xml 文件里面统一存放
四. UrlRouting实现原理
为了方便大家理解我绘制了一个UML图,其中通过RouteTable的Routes这个属性可以获取一个RouteCollection的Singleton模式,虽然在其中并没有判断值不存在时才初始化的Singleton的标志性行为,但是它是在Application_Start事件中进行初始化的,并且直到应用程序进程终结,所以是Singleton模式的。
而通过以下方式将Route添加到RouteTable.Routes中
RouteTable.Routes.Add(new Route());
以上代码仅为表示其流程,这个代码是不能正确执行的,因为Route没有提供无参构造函数。
Route初始化时则是利用RouteValueDictionary来加入默认值及规则到Route中
另外Route还有一个IRouteHandler的实现对象,IRouteHandler的实现对象提供了一个GetHttpHandler方法来获取用于处理URL的IHttpHandler。
五. UrlRouting的代码实现
global.asax 文件里面的代码如下:
{
/// <summary>
/// 创建一个路由表
/// </summary>
/// <param name="routes">路由集合,由asp.net 路由集合提供</param>
public static void RegisterRoutes(RouteCollection routes)
{
//表示.axd页面不经过路由处理
//如果说你有aspx页需要设置可以直接访问的话应该加上
//routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");这一句
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//1、大家可以回忆一下Controller和Action的定义
//因为MVC与传统Aspx的最大不同就是访问是
//访问的Controller.Action即某类下的一个函数而不是aspx文件,
//要展现给用户哪一个aspx文件是由Controller决定的(即默认的同名规则)
//这个是文件默认自带的UrlRouting规则,是将Controller/Action/id的访问
//模式指向对应的Controller及Action
routes.MapRoute(
"Default", // 默认路由名称
"{controller}/{action}/{id}", // 这是 url 解析格式 ,大括号括起来的是需要解析的参数 {controller}是找到对应的 控制器,{action}是控制器里面的对应的方法,{id}是默认提供的一个参数名,类似我们以往的 http://localhost/index.aspx?id=XXX 这url里面的id参数
new { controller = "Home", action = "Index", id = "" }//参数的默认值也就是如果各部分为空的话访问
//HomeController下的Index这个Action
//是默认的参数,当没有指定{controller}时 默认 "Home"这个控制器,当没有指定 {action}时 默认"Index" 这个执行方法,类似的 id 就是 如果没有指定{id} 则 使用这里的值
);
}
/// <summary>
/// 应用程序启动时调用事件
/// </summary>
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
六: UrlRouting 规则
Ø 定义URL路由
将用户请求的URL路由解析为一系列的离散值,该URL路由通过占位符定义URL的模式。在URL路由中,通过大括号({})定义占位符,这些占位符就是URL路由参数,而字符串中的“/”、“.”等符号则作为分隔符被URL路由解析这些离散的数据,对于不在小括号或者方括号中的信息则被视为一个常量。
有效的URL路由定义 |
匹配的URL例子 |
{controller}/{Action}/{id} |
/products/show/beverages |
{table}/Details.aspx |
/products/ Details.aspx products:表名 Details.aspx为常量 |
blog/{Action}/{entry} |
/ blog(常量) /show(相关控制器重的方法)/123(一个entry变量) |
{reporttype}/{year}/{month}/{day} |
/sales(reporttype变量)/2008(year变量)/1(month变量)/5(day变量) |
Ø 设定URL路由通配符
为了实现对一类URL路由的定义,可以使用星号来定义URL路由通配符。
假定url路由通配符为:query/{queryname}/{*queryvalues},则
URL |
通配符参数值 |
/query/select/bikes/onsale |
Bikes/onsale |
/query/select/bikes |
bikes |
/query/select |
空白字符串 |
Ø 添加URL路由参数的约束
Constraints=new RouteValueDictionary{{"locale","{a-z}{2}-{A-Z}{2}"},{year,@"\d{4}"}};
Locale必须为英文字母,前面2位英文字母必须小写的,后面2位英文字母必须大写的。而year必须是4位数字。
URL |
匹配结果 |
/en-us/2008 |
不匹配 |
/en-US/08 |
不匹配 |
/en-US/2008 |
Locale=”en-US”,year=”2008” |
Routing的扩展方法
扩展方法的由来:路由程序集(System.Web.Routing)是在2008年8月11日更新 的.NET 3.5框架SP1版本中发布的,而ASP.NET 3.5 MVC 1.0版本是在2009年3月18日才正式发布。在ASP.NET MVC版本的不断改进中,微软的开发团队感觉到以往的路由设置给开发者带来不便,但是路由的程序集已经发布,如何在路由程序集中添加新的功能呢?所以将扩展方法加在了 System.Web.Mvc程序集的RouteCollectionExtemsion类中。
优化路由设置
Ø 设置路由名称:在路由的设置中,路由名称是可选的输入参数,路由名称可以用来生成URL路由,但是在路由解析中没有什么作用。当开发者使用路由名称来生成url路由的时候,路由模块将快速定位到指定名称的路由。则不会通过查询的方式,一个接一个的查询。而是直接跳转到路由表中的对应路由名称的路由。
Ø 将常用的路由存放在路由表的最前面。该方法不仅提高生成url路由的效率,而且还提高路由解析的效率。这是因为在解析路由的过程中,一旦选找到匹配的路由,就停止路由解析。
但需要说明的是,在改变路由的存放位置时,需要注意路由的次序改变是否实质性影响匹配。