【问题标题】:MVC Area Home displays default HomeMVC 区域主页显示默认主页
【发布时间】:2016-10-18 13:43:35
【问题描述】:

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

找到了与名为“Home”的控制器匹配的多种类型。如果为该请求提供服务的路由 ('{controller}/{action}/{id}') 未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用带有“namespaces”参数的“MapRoute”方法的重载来注册此路由。

“主页”请求找到了以下匹配的控制器: MyApp.Controllers.HomeController MyApp.Areas.MyArea.Controllers.HomeController

研究该问题后,我发现我需要将默认命名空间添加到对 MapRoutes() 的调用中,这样就停止了错误。不幸的是,我现在发现当我转到 /MyArea/Home/Index 时,该应用实际上显示了 /Home/Index 的视图 - 我无法显示来自区域的 Home 控制器。

这是我的代码:

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
        );
}

有人对如何解决这个问题有任何好的想法吗?

更新:

该问题仅在调用两个 HomeController 类中存在的操作时才会出现,例如 Index。在区域的 HomeController 中调用默认 HomeController 中不存在的操作会显示正确的视图。

更新 2:

原来这是一个经典的PICNIC 错误——我的代码中有一个简单的错字,所以该操作开始寻找一个不存在的视图。因此,它选择了它可以找到的第一个匹配视图 - “根”中的那个

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-18
        • 2012-03-06
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多