19

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

当我将路由映射到该{controller}/{action}对时,我将 role = "SomeRole" default 传递给路由。

如果我通过完整的 url ( 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"了以前的MapRoute

我该如何解决这个问题?

4

4 回答 4

35

确保Default路由位于列出的路由表的底部。当涉及到 ASP.NET MVC 路由表时,顺序很重要。

正确的顺序是您最不具体的路线的“最具体”路线。

于 2009-06-10T00:47:33.533 回答
18

事实上,乔治是对的。MVC 路由尊重排序路由。您的最后一条路线必须尽可能通用,而您之前的路线必须尽可能具体。

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

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

接着

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

所以,你给两条路线都提供了特异性。

于 2009-06-24T03:18:16.527 回答
13

Phil Haack发布了一个路由调试工具,对于了解此类问题非常有用。

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

于 2009-06-10T12:18:32.047 回答
2

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

于 2009-06-10T01:08:49.997 回答