首页 文章

MVC区域主页显示默认主页

提问于
浏览
0

我最近在现有的MVC 4网络应用程序中添加了区域 . 我的一个区域有一个Home控制器,所以很明显当我导航到 /MyArea/Home/Index 时我想显示它的索引视图 . 最初我收到以下错误:

找到了与名为“Home”的控制器匹配的多个类型 . 如果为此请求提供服务的路由(' / / ')未指定名称空间来搜索与请求匹配的控制器,则会发生这种情况 . 如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由 . 对'Home'的请求找到了以下匹配的控制器:MyApp.Controllers.HomeController MyApp.Areas.MyArea.Controllers.HomeController

研究这个问题我发现我需要在调用 MapRoutes() 时添加默认命名空间,这就停止了错误 . 不幸的是我现在发现,当我去 /MyArea/Home/Index 时,该应用实际上显示了 /Home/Index 的视图 - 我可以't display actions from the Area' s家庭控制器 .

这是我的代码:

Global.aspx.cs

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

MyApp.RouteConfig

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

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional},
        namespaces: new[] {typeof(MyApp.Controllers.HomeController).Namespace}
        );
}

MyApp.Areas.MyArea.MyAreaRegistration

public override void RegisterArea(AreaRegistrationContext context)
{
    var ns = typeof(MyApp.Areas.MyArea.Controllers.HomeController).Namespace;

    var routeName = AreaName + "_Route";
    var routeUrl = AreaName + "/{controller}/{action}/{id}";
    var routeDefaults = new {controller = "Home", action = "Index", id = UrlParameter.Optional};
    var routeNamespaces = new[] {ns};

    context.MapRoute(
        name: routeName,
        url: routeUrl,
        defaults: routeDefaults,
        namespaces: routeNamespaces
        );
}

谁有任何关于如何解决这个问题的好主意?

Update:

只有在调用HomeController类(如Index)中存在的操作时才会出现此问题 . 在区域的HomeController中调用默认HomeController中不存在的操作会显示正确的视图 .

Update 2:

事实证明这是一个经典的PICNIC错误 - 我的代码中的一个简单错字,所以行动寻找一个不存在的视图 . 因此,它可以找到它可以找到的第一个匹配视图 - "root"中的一个

3 回答

  • 0

    当您链接到MyArea区域中的那个时,需要在routeValues参数中添加 new { Area = "MyArea" } .

  • 1

    RegisterArea 函数中,您应该更新 routeDefaults 以包含区域名称 .

    var routeDefaults = new {controller = "Home", action = "Index", area = AreaName, id = UrlParameter.Optional};
    
  • 1

    <捂脸>

    在导入区域代码的过程中,我在视图的文件夹名称中输入了一个拼写错误,因此MVC无法为区域操作找到正确的index.cshtml .

    </捂脸>

    从外观上看,当MVC无法找到区域操作的视图时,它会使用默认视图 . 一旦我修改了Areas \ MyArea \ Views中文件夹的名称以匹配控制器名称,一切都按预期工作 .

    1回答的人 - 你的回答很有帮助,我已经在我的更新代码中使用了这两个

相关问题