我很难在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" });
我试图从最具体到最少的顺序订购。
第一个“博客”路线运行正常,我可以使用/blog/list/2/5
之类的网址,并将其正确映射到我的控制器。
底部的默认路线也正如我所料。
但是,如果我有这样的行动方法:
public ActionResult BarX(int id)
{
//some stuff
}
public ActionResult BarY(string title)
{
//some stuff
}
我希望它使用第三条路线并生成类似/foo/barX/3
的网址。
然而,如果我使用
@Html.ActionLink("TEST1", "barX", "foo", new { id = 3 }, null)
生成的网址是
/foo/barx?id=3
类似地为
生成的URL@Html.ActionLink("TEST2", "barY", "foo", new { title = "test" }, null)
是
/foo/bary?title=test
所以我想我的问题是:为什么他们使用旧的?id=
语法而不是/foo/barx/3
生成网址?
答案 0 :(得分: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/...
时,再次只有一条路线匹配。默认情况下会处理{Controller}/{Action}/{id}
之类的任何内容,而Blog
或Code
作为第一个路由参数。