asp mvc路由问题

时间:2010-11-21 11:38:34

标签: asp.net-mvc routes

我有这两条路线。

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

有人能指点我关于路线的好教程吗?

3 个答案:

答案 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为你做了这个练习。它显示了与给定请求匹配的每条路线。