2010-11-21 100 views
0

我有这两条路线。asp mvc路由问题

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

为什么这个网址进入第一个路径/我的/全部/ P5

有人能指出我约航线好教程?

回答

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

阅读:史蒂芬·桑德森在第8章(You can find it here

在他的著作(临MVC 2)路由从书的很好的解释:

如果有一个黄金法则路由, 这是它:更具体的路线 条目之前的不太具体的。 是的,RouteCollection是一个有序的 列表,并且您添加 路由条目的顺序对于 路由匹配过程至关重要。

+0

你能通过解释解释来帮助提问者解答吗? – 2010-11-21 12:16:50

+0

你是什么意思?他问了一些很好的教程,我指出了一个了解路由的好地方。 – 2010-11-21 12:24:58

1

我有一系列博客文章对路由,你可以在这里阅读:http://haacked.com/tags/Routing/default.aspx

而且,路线调试器http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx是与路由玩弄和理解为什么你认为应该匹配的路由是一个有用的工具不匹配。

顺便说一句,马修阿博特是正确的。您需要重新订购路线。纳扎尔从史蒂文桑德森的书中引用的原因就是这种情况。路由按照顺序评估路由,第一个路由赢得

下面是我为调试这种情况所做的简单练习。看着你的要求:

/我的/全部/ P5

我会去通过每路线一次一个在我的系统,并要求,“将它匹配吗?”。答案是肯定的第一条路线是匹配的路线。在你的例子中,你可以看到这条路线是第一条路线。这就是为什么史蒂文建议首先放置更具体的路线,以便它们匹配。

我之前提到的路由调试器为你做了这个练习。它会向您显示符合给定请求的每条路线。