(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开头。
路由匹配的几点小结
时间: 2024-10-26 08:26:12