我创建了一个新的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}}。
我该如何解决这个问题?
答案 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请求确定操作时,它将按照添加顺序的顺序查看。第一次找到匹配的,它就会停止。所以可能发生的事情就是它匹配你之前添加的那个。