首页 > 代码库 > 路由匹配的几点小结
路由匹配的几点小结
(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开头。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。