我有这两条路线。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
routes.MapRoute(
"Paging", // Route name
"{controller}/{action}/p{currentPage}",
new { controller = "Home", action = "Index" },
new { currentPage = "\\d+" });
我有这个控制器
public class MyController
{
public ActionResult All(int currentPage = 1)
{
// some code executed here
return View(pList);
}
}
为什么这个网址会转到第一条路线/ My / All / p5
有人能指点我关于路线的好教程吗?
答案 0 :(得分:3)
路线需要以正确的顺序进行注册,因为它们的处理顺序与注册顺序相同。你的第一条路线基本上是一个全部捕获,所以它也匹配/My/All/p5
。首先注册该路线:
routes.MapRoute(
"Paging", // Route name
"{controller}/{action}/p{currentPage}",
new { controller = "Home", action = "Index" },
new { currentPage = "\\d+" });
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
答案 1 :(得分:1)
阅读:Steven Sanderson在第8章的书(Pro MVC 2)中对路由有很好的解释。(You can find it here)
从书中可以看出:
如果路由有一条黄金法则, 就是这样:把更具体的路线 不太具体的条目之前的条目。 是的,RouteCollection是有序的 列表,以及您添加的顺序 路线入口对于 路线匹配过程。
答案 2 :(得分:1)
我有关于路由的一系列博客文章,您可以在此处阅读:http://haacked.com/tags/Routing/default.aspx
此外,路由调试器http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx是一个非常有用的工具,可用于路由和理解您认为应该匹配的路由不匹配的原因。
顺便说一句,马修艾伯特是正确的。您需要重新排序路线。纳扎尔引用史蒂文桑德森的书就说明了这种情况。路由按顺序评估路径,第一个获胜。这是我为调试这种情况所做的简单练习。看看你的要求:
/我/全部/ P5
我会在我的系统中逐个浏览每条路线并询问“它会匹配吗?”。答案是肯定的第一条路线是匹配的路线。在您的示例中,您可以看到该路线是第一条路线。这就是为什么史蒂文建议将更具体的路线放在首位,这样才能匹配。
我前面提到的Route Debugger为你做了这个练习。它显示了与给定请求匹配的每条路线。