【问题标题】:ASP.NET MVC Default route?ASP.NET MVC 默认路由?
【发布时间】:2010-11-01 16:09:13
【问题描述】:

我创建了一个新的 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" });

然后我从之前的MapRoute 中丢失了role="SomeRole"

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    其实George is right。 MVC 路由尊重排序路由。您的最后一条路线必须尽可能通用,而您之前的路线必须尽可能具体。

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

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

    然后

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

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

    【讨论】:

    • 在 MVC4 中“默认”路由声明从 Global.asax 移动到 ~/App_Start/RouteConfig.cs/RegisterRoutes()
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2017-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 2011-04-29
        • 2021-12-18
        相关资源
        最近更新 更多