什么是网址路由?
理论上的东西,小编也就不在多说了,只简单的介绍下,自己的认识。
所谓的网址路由,就是一个规则。通过这个规则来匹配。就好比我们经常用到的正则表达式一样。
默认的网址路由
打开项目中的RouteConfig.cs的话,会看到如下代码
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">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 } ); }</span></span>
所有的ASP.NET MVC Routing都会在此定义。其中Routable.Routes是一个公开的静态对象,用于存储所有的Routing的规则集
路由分析
看完了上面默认的路由信息,下面来解读一下。
1.每一个routes都代表了一个匹配的规则。
2.IgnoreRoutes:定义了不需要匹配Routing处理的网址。
3.resource:随便的一个名称,用来匹配网址中类似**.axd
4.{*pathInfo}:*是我们经常见到的,代表全部,取到全部的意思。例如网址是/Test.axd/b/d/e,则{pathInfo}就带表b/d/e.但是如果不带*的话,就会只取到b变量的位置。
5.MapRoute就是所谓的定义默认路由规则
试一试
看了上面的解释,来几个例子体验一下。
例子一:网址是http://localhost/Test.axd/b/c/d/e和http://localhost/Test.axd
1.先比对Routes.IgnoreRoute。通过比对发现两者刚好合适,只不过后者中的{*patchInfo}为空而已。所以Http请求会由此网址服务。
例子二:网址是Http://localhost/Home/Login?id=3
1.从上至下开始比对,由于Routes.IgnoreRoute规则不通过,所以开始比对Routes.MapRoute的规则。
2.通过比对{controller}/{action}/{id},我们可以得到controller=Home,action=Login,而?id=3就不在是此规则中的了。
3.因为规则中都是以斜杠(/)来划分的,因此id=123比对不到但是可以读取到向的默认值UrlParamete.Optional。
路由扩展
如上述分析,我们知道了路由的规则后,因此也可以定制属于自己的规则。
正则表达式
<span style="font-family:SimSun;font-size:18px;"> //路由约束 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 =""}, //添加限制条件,只允许Controller是以H开头 constraints: new { controller="^H.*"} ); }</span>
以上在路由中通过Contraints添加为路由添加了限制条件,只允许通过以H开头的。
网址路由还有其他的一些用途,有兴趣的,多多研究与分享。