具有不同参数类型的MVC3路由

时间:2013-03-25 00:36:51

标签: asp.net asp.net-mvc asp.net-mvc-3 routes asp.net-mvc-routing

我很难在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生成网址?

1 个答案:

答案 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}之类的任何内容,而BlogCode作为第一个路由参数。