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