ASP.NET MVC默认路由?

时间:2009-06-10 00:45:16

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

我创建了一个新的ASP.NET MVC项目并实现了站点授权过滤器。

当我将路线映射到{controller}/{action}对时,我将一个角色=“SomeRole”默认传递给路线。

如果我浏览完整网址(http://localhost/somecontroller/someaction)并且我指定了完整路线

,它的效果非常好
MapRoute("SomeAction", "somecontroller/someaction",
 new { controller = "SomeController", action = "SomeAction", role = "SomeRole");

问题在于,当有人访问http://thesiteaddress.com时,必须有一个默认路由调用/home/index而不是/,如果我指定

MapRoute("Default", new { controller="somecontroller",action="action" });

然后我丢失了之前role="SomeRole"的{​​{1}}。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:34)

确保Default路线位于所列路线表的 BOTTOM 位置。对于ASP.NET MVC路由表,顺序很重要。

正确的订购是您最不具体路线的“最具体”路线。

答案 1 :(得分:17)

实际上,George is right。 MVC路由遵循订购路线。您的最后一条路线必须尽可能通用,并且您之前的路线必须尽可能具体。

在您的情况下,两者都是通用的。你应该

MapRoute("SomeAction", "Post/{action}", new {controller = "Post", role = "User");

然后

MapRoute("Default", new {controller="Home", action="Index", role = "Anonymous"});

所以,你给两条路线都特别。

答案 2 :(得分:12)

Phil Haack released一个路线调试工具,对于了解这类问题非常有用。

使用此工具,您可以查看MVC应用程序如何解析URL并将其与RouteTable匹配。

答案 3 :(得分:2)

当您未提供路由名称或通过HTTP请求确定操作时,它将按照添加顺序的顺序查看。第一次找到匹配的,它就会停止。所以可能发生的事情就是它匹配你之前添加的那个。