2

我很努力地在MVC3中绕过路由。MVC3不同参数类型的路由

以前我一般只是回避整个区域,并坚持与丑陋的旧?id=1&foo=bar类型的网址。不太好。

我有4个路由定义正是如此

routes.MapRoute("Blog", "{controller}/{action}/{PageNumber}/{PostsPerPage}", new { controller = "blog", action = "list", PageNumber = UrlParameter.Optional, PostsPerPage = UrlParameter.Optional }); 
routes.MapRoute("Code", "{controller}/{action}/{title}", new { }); 
routes.MapRoute("Id", "{controller}/{action}/{id}", new { }); 
routes.MapRoute("Default", "{controller}/{action}", new { controller = "home", action = "index" }); 

我试图将它们顺序从最具体到最不。

第一个'博客'路线工作正常,我可以使用一个URL,如/blog/list/2/5,它正确映射到我的控制器。

底部的默认路由也按我的预期工作。

但是如果我有行动的方法是这样的:

public ActionResult BarX(int id) 
{ 
    //some stuff 
} 

public ActionResult BarY(string title) 
{ 
    //some stuff 
} 

我希望它使用第三路线和产生的URL像/foo/barX/3

然而,如果我用

@Html.ActionLink("TEST1", "barX", "foo", new { id = 3 }, null) 

生成的URL是

/foo/barx?id=3 

@Html.ActionLink("TEST2", "barY", "foo", new { title = "test" }, null) 

同样生成的URL是

/foo/bary?title=test 

所以我想我的问题是:为什么他们生成旧的?id=语法的URL而不是/foo/barx/3

回答

8

您的所有路线基本相同。他们是

{controller}/{action}/{param}/{param} 

我说的一样,因为路由引擎不会明白{controller}/{action}/{id}{controller}/{action}/{title}

和路由引擎之间的差别真的只是看到

{controller}/{action}/{PageNumber}/{PostsPerPage} 

,迷惑所有路线与第一个。


一旦路由引擎看到在顶部的几乎通用{optional}/{optional}/{optional}/{optional}/路线,用4组或更少的元素任何如此这般不再能适应它。


如果,另一方面,你的路由具有与众不同的开端,而不是一般{Controller}

routes.MapRoute("Blog", "Blog/{PageNumber}/{PostsPerPage}", new { controller = "blog", action = "list", PageNumber = UrlParameter.Optional, PostsPerPage = UrlParameter.Optional }); 
routes.MapRoute("Code", "Code/{title}", new { controller = "code", action = "list", title = UrlParameter.Optional }); 
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "home", action = "index", id = UrlParameter.Optional }); 

现在,每一次路由引擎看到Blog/...它知道,只有1路可以比拟。与其他人一样,它将继续寻找比赛。每当它看到Code/...时,再次只有1条路线是匹配的。并且Default将处理类似{Controller}/{Action}/{id}这样的没有BlogCode作为第一个路由参数。

+2

“您的所有路线基本相同。” +1 - 钉在头上。 – 2013-03-25 01:00:54