MVC中的网址路由

版权所有,禁止匿名转载;禁止商业使用。

什么是网址路由?

理论上的东西,小编也就不在多说了,只简单的介绍下,自己的认识。

所谓的网址路由,就是一个规则。通过这个规则来匹配。就好比我们经常用到的正则表达式一样。

默认的网址路由

打开项目中的RouteConfig.cs的话,会看到如下代码

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 }
      );
    }

所有的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。
 路由扩展
 如上述分析,我们知道了路由的规则后,因此也可以定制属于自己的规则。
 正则表达式
 //路由约束
   

 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.*"}
        
  
      );
  }

   
 以上在路由中通过Contraints添加为路由添加了限制条件,只允许通过以H开头的。

 

0 0