首页 > 代码库 > 路由匹配的几点小结

路由匹配的几点小结

(1)控制器和动作方法的名字不区分大小写。

        public static void RegisterRoutes(RouteCollection routes)
        { 
            routes.MapRoute("MyRoute", "{controller}/{action}",
                new { Controller = "Home", Action = "Index"});
        }

对于测试

       [TestMethod]
        public void TestIncomingRoutes()
        {
            TestRouteMatch("~/", "home", "index");   //通过
        }

 

TestRouteMatch("~/AAA/BBB", "aaa", "bbb");  //通过

 

TestRouteMatch("~/AAA", "aaa", "Index");    //通过

 

(2)可以使用静态URL片段,使路由只匹配地址中某一部分为固定值的URL

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute("", "Public/{controller}/{action}",
                new { Controller = "Home", Action = "Index" });
        }

对于测试:

       [TestMethod]
        public void TestIncomingRoutes()
        {
            TestRouteMatch("~/Public/AAA/BBB", "AAA", "BBB");
            TestRouteMatch("~/Public/AAA", "AAA", "Index");
            TestRouteMatch("~/Public", "Home", "Index");
        }

上面三种形式能通过测试,除此以外都不行。

 

(3)使用静态URL片段时要注意路由顺序

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute("MyRoute", "{controller}/{action}",
                new { Controller = "Home", Action = "Index"});
            
routes.MapRoute(
"", "Public/{controller}/{action}", new { Controller = "Home", Action = "Index" }); }

上面有两个路由,因此URL进来匹配的时候要注意顺序,从上往下,依次匹配。

这个时候,对于如下URL

"~/Public"

就匹配不了第二个路由了,因为按照从上往下的顺序,在第一个路由匹配的时候就被拦截。

对于测试:

        [TestMethod]
        public void TestIncomingRoutes()
        {
           TestRouteMatch("~/Public/AAA/BBB", "AAA", "BBB");  //通过,第一个路由不匹配3段式,漏下来匹配第二个路由
           TestRouteMatch("~/Public/AAA", "AAA", "Index");   //出错,两段式、一段式或"~/"都被第一个路由拦截。控制器应匹配为Public,动作为AAA
           TestRouteMatch("~/Public", "Home", "Index");      //出错,被第一个路由拦截。控制器应匹配为Public,动作为Index
        }

 

 (4)使用静态URL片段将指定的旧地址重新映射到新的控制器和动作方法上

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute("ShopSchema2", "Shop/OldAction",  //注意没有大括号是静态URL
                new { Controller = "Home", Action = "NewAction"});

            routes.MapRoute("ShopSchema", "Shop/{action}",
                new { Controller = "Home", Action = "Index" });
        }

对于测试:

        [TestMethod]
        public void TestIncomingRoutes()
        {
            TestRouteMatch("~/Shop/OldAction", "Home", "NewAction");
            TestRouteMatch("~/Shop", "Home", "Index");
            TestRouteMatch("~/Shop/AAA", "Home", "AAA");
            TestRouteFail("~/AAA/BBB");
        }           

 

"~/Shop/OldAction" 将原来指定的这种URL重新映射到控制器Home、动作方法NewAction上。
"~/Shop"第一个路由不匹配,漏下来,匹配第二个路由,控制器默认为Home,动作方法没有给出来,默认为Index。
"~/Shop/AAA"第一个路由不匹配,匹配第二个路由,控制默认为Home,动作方法指定为AAA。
"~/AAA/BBB"没有匹配的路由,只定义了两个路由,都必须由静态地址~/Shop开头。