【问题标题】:MVC Areas - Non Area Route Resolves To AreaMVC 区域 - 非区域路由解析为区域
【发布时间】:2011-08-07 10:29:33
【问题描述】:

我在我的 MVC 3 项目中添加了一个区域。我似乎无法在一个非常简单的场景中使用路由。它似乎总是想解决这个问题。这是我的配置。启动时:

AreaRegistration.RegisterAllAreas();
IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Browse", action = "Index", id = UrlParameter.Optional }

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Admin"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller = "Users", action = "Index", id = UrlParameter.Optional }
        );
    }
}

在 web.config 中:

<authentication mode="Forms">
  <forms loginUrl="~/Login" defaultUrl="~/Browse" timeout="60" cookieless="UseDeviceProfile" />
</authentication>

我正在使用 RouteDebugger 来尝试解决它。当我导航到登录页面时,调试器显示:

  • AppRelativeCurrentExecutionFilePath: ~Login
  • Admin/{controller}/{action}/{id} 不匹配当前请求
  • {controller}/{action}/{id} 匹配当前请求
  • 匹配路线:{controller}/{action}/{id}

到目前为止一切顺利。但随后它显示了这一点:

  • 生成的 URL:/Admin/Login?ReturnUrl=%2F 使用路由“Admin/{controller}/{action}/{id}”

接下来我登录。我的Login/Index方法没有命中,调试器显示:

  • AppRelativeCurrentExecutionFilePath: ~Login
  • Admin/{controller}/{action}/{id} 不匹配当前请求
  • {controller}/{action}/{id} 匹配当前请求
  • 匹配路线:{controller}/{action}/{id}
  • 生成的 URL:/Admin/Login?ReturnUrl=%2FAdmin%2FLogin 使用路由“Admin/{controller}/{action}/{id}”

一方面它说它与 Admin 路由不匹配,然后在生成的 URL 中它说它正在使用该路由。我被难住了。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-areas


    【解决方案1】:

    尝试将带有预定义值的区域参数添加到路由定义中...例如,而不是:

    context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { controller = "Users", action = "Index", id = UrlParameter.Optional }
            );
    

    使用:

    context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { area = "Admin", controller = "Users", action = "Index", id = UrlParameter.Optional }
            );
    

    如果有帮助,请告诉我... 问候

    【讨论】:

    • 我完全按照你说的做了。首先,我尝试在非区域注册之前进行区域注册。不好。到非区域控制器的链接总是在它们前面用“Admin/”解析。所以我颠倒了注册顺序。然后,当我导航到“~/Admin”时,我得到“~/Home/NotFound”,调试器在“{controller}/{action}/{id}”路由上显示匹配。当我导航到“~/Admin/Users”时,我得到“~/Admin/Home/Home/Home/NotFound”,调试器在 {catchall} 路由上显示匹配。
    • 当我说“到非区域控制器的链接总是在它们前面用 'Admin/' 解析”时,这并不完全正确。 Html.ActionLink 正确解析。但是 Html.BeginForm 和 Html.BuildUrlFromExpression 解析到管理区域,即使 T 是不在区域中的控制器。
    • 我用的是2.0版本的Microsoft.Web.Mvc,其中这些方法不明白的地方。它已在 3.0 中修复。
    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2010-12-09
    • 2018-05-31
    相关资源
    最近更新 更多