2

我正在努力解决 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
}

我希望它使用第三条路由并生成一个类似/foo/barX/3.

然而,如果我使用

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

生成的 URL 是

/foo/barx?id=3

同样,生成的 URL

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

/foo/bary?title=test

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

4

1 回答 1

9

你所有的路线基本上都是一样的。他们是

{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作为第一个路由参数的东西。

于 2013-03-25T00:41:26.680 回答