也许我不正确地理解MVC Areas的工作原理,但这使我有些困惑。

  • 在MVC3项目
  • 上的Visual Studio中,右键单击“添加区域”,添加一个名为“MyArea”的区域
  • 为MyArea:“AnArea”创建一个在MyArea区域具有匹配 View 的 Controller 。
  • 向MyAreaAreaRegistration.RegisterArea方法中的context.MapRoute的默认参数中添加“controller =“AnArea”。

    因此,在这一点上,如果您启动应用程序并导航至/MyArea/,则应使用其匹配的 View 加载AnArea Controller 。如果导航到/MyArea/AnArea,它将显示相同的结果。

    但是,如果导航到/AnArea/,则仍会找到 Controller ,并显示以下错误消息:
    The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
    ~/Views/anarea/Index.aspx
    ~/Views/anarea/Index.ascx
    ~/Views/Shared/Index.aspx
    ~/Views/Shared/Index.ascx
    ~/Views/anarea/Index.cshtml
    ~/Views/anarea/Index.vbhtml
    ~/Views/Shared/Index.cshtml
    ~/Views/Shared/Index.vbhtml
    

    这是正确的行为吗?我本以为一个区域的 Controller 只能通过它自己的区域而不是全局来访问。

    最佳答案

    每当我创建一个具有区域的项目时,都会按以下方式更改Default路线:

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // defaults
            null,  // constraints
            new string[] { "MyApplication.Controllers" } // namespaces
        );
    

    最后一个参数将限制到MyApplication.Controllers命名空间中的 Controller 的默认路由。这样可以确保默认路由仅限于任何区域之外的操作。

    更新

    深入研究代码后,我发现了问题所在,并找到了解决方案。将您的默认路由更改为以下内容:
    routes.Add(
        "Default",
        new Route("{controller}/{action}/{id}",
            new RouteValueDictionary(
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            ),
            null,
            new RouteValueDictionary(
                new {
                    Namespaces = new string[] { "MyApplication.Controllers" },
                    UseNamespaceFallback = false
                }
            ),
            new MvcRouteHandler()
        )
    );
    

    关键在于添加UseNamespaceFallback token 。这将防止“默认”路由查看任何其他 namespace 。

    这是意外行为,这是我不知道的问题,它会影响我正在处理的项目。我将在aspnet.codeplex.com上将其列为问题。我不会将其称为错误,但是这种行为肯定似乎违反了MVC路由的要求。

  • 10-07 19:54
    查看更多