ASP.NET MVC默认路由?

18 asp.net-mvc routing asp.net-mvc-routing

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

当我将路由映射到该{controller}/{action}对时,我将一个role ="SomeRole"默认传递给该路由.

如果我通过完整的url(http://localhost/somecontroller/someaction)并指定了完整的路径,它的工作原理非常好

MapRoute("SomeAction", "somecontroller/someaction",
 new { controller = "SomeController", action = "SomeAction", role = "SomeRole");
Run Code Online (Sandbox Code Playgroud)

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

MapRoute("Default", new { controller="somecontroller",action="action" });
Run Code Online (Sandbox Code Playgroud)

然后我失去role="SomeRole"了以前的MapRoute.

我怎么解决这个问题?

Geo*_*ker 34

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

正确的订购是您最不具体路线的"最具体"路线.


Jir*_*ong 17

实际上,乔治是对的.MVC路由遵循订购路线.您的最后一条路线必须尽可能通用,并且您之前的路线必须尽可能具体.

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

MapRoute("SomeAction", "Post/{action}", new {controller = "Post", role = "User");
Run Code Online (Sandbox Code Playgroud)

然后

MapRoute("Default", new {controller="Home", action="Index", role = "Anonymous"});
Run Code Online (Sandbox Code Playgroud)

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

  • 在MVC4中,"Default"路由声明从Global.asax移到〜/ App_Start/RouteConfig.cs/RegisterRoutes() (9认同)

Ray*_*gus 12

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

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