【问题标题】:ASP.NET MVC Area not picking up the correct routeASP.NET MVC 区域没有选择正确的路线
【发布时间】:2011-06-18 20:10:35
【问题描述】:

我正在调试我的 MVC 3 应用程序的路由问题,我正在使用 Phil Hacks 路由调试器。

我似乎无法确定下面以黄色突出显示的路线的起点。每次我使用以下请求运行我的应用程序时

http://www.mywebsite.com/auth/login?ReturnUrl=/

这条路线首先出现,然后给我一个 404 错误,因为我没有索引操作。如您所见,我已将默认路由设置为使用 Login 操作方法,但该路由仍然存在。

我有以下路线配置:

授权区域注册

public class AuthAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Auth";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "login",
            "auth/login/{*returnPath}",
            new { controller = "Auth", action = "LogIn", id = UrlParameter.Optional }
        );

        context.MapRoute(
            "Auth_default",
            "Auth/{controller}/{action}/{id}",
            new { controller = "Auth", action = "LogIn", id = "" }
        );
    }
}

Global.asax(使用 T4 MVC 模板)

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Home",
            "{controller}/{action}/{id}",
            MVC.Home.Index(), new { id = UrlParameter.Optional },
            new string[] { "MyNamespace.WebUI.Controllers" }

        );

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            MVC.Home.Index(), new { id = UrlParameter.Optional },
            new string[] { "MyNamespace.WebUI.Controllers" }
        );
    }

【问题讨论】:

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


    【解决方案1】:

    我不喜欢回答我自己的问题,但是在尝试解决这个问题一天之后,我想我会发布答案,以防其他人有同样的问题。

    事实证明,我的应用程序保留了旧路由并将它们填充到我的路由集合中。我删除了 bin 文件夹中的所有文件并重建了我的解决方案,一切正常。

    我已经在这里更详细地回答了这个问题:

    Does ASP.NET MVC create default routes for areas

    【讨论】:

      【解决方案2】:

      我认为问题在于您有一个名为 Auth区域 和一个名为 Auth控制器 > 区域之外。

      MVC 将首先尝试将您的 url 与 Auth 区域匹配,但您实际上希望它在区域外访问您的 auth 控制器。

      恕我直言,最好的解决方法是避免控制器/区域的名称不明确。

      【讨论】:

      • 感谢您的回复,但我的身份验证控制器实际上位于我的身份验证区域,即区域/身份验证/控制器/身份验证控制器。这对我来说是控制器的逻辑位置。尽管我确实知道您来自控制器/区域的整个模棱两可的命名。
      • 如果您想在 Auth 区域的控制器 Auth 上调用操作登录,那么您的 url 应该是 www.mywebsite.com/Auth/Auth/Login
      • 感谢 Jakub,但我正在努力让它在代码中易于阅读且对 url 友好,即 www.mywebsite.com/auth/login。我通过捕获 auth/login 请求模式并将其分配给 controller = Auth, action = LogIn 来做到这一点,这是我的 AuthAreaRegistration 中的第一条路由。有时这确实会捕获并处理它,但是我不知道我上面提到的其他路由来自哪里以及为什么它出现在路由列表的顶部。
      • 如果您只想要 /auth/login 和大概 /auth/logout ,那么为什么不将控制器移出该区域呢?在我看来,您已将控制器放在一个区域内,然后您试图假装它不在那里......(顶部路线是 Auth_default)
      猜你喜欢
      • 1970-01-01
      • 2015-01-04
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2018-05-31
      • 1970-01-01
      相关资源
      最近更新 更多