找到了与名为“Home”的控制器匹配的多种类型 - 在两个不同的区域中

Posted

技术标签:

【中文标题】找到了与名为“Home”的控制器匹配的多种类型 - 在两个不同的区域中【英文标题】:Multiple types were found that match the controller named 'Home' - In two different Areas 【发布时间】:2012-01-09 11:53:48 【问题描述】:

我的项目中有两个领域。现在,当我运行程序时,出现此错误:

Multiple types were found that match the controller named 'Home'. This can happen if the route that services this request ('controller/action/id') does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.

The request for 'Home' has found the following matching controllers:
BaseAdminMVC.Areas.BaseAdmin.Controllers.HomeController
BaseAdminMVC.Areas.TitomsAdmin.Controllers.HomeController  

我在这里找到了一些来源:Multiple Controller name 但我认为它只适用于一个领域。 就我而言,我在不同领域有两个项目。希望有人能告诉我应该怎么做才能解决这个问题。 这是Global.asax 文件:

public static void RegisterRoutes(RouteCollection routes)
        
            string[] namespaces = new string[]  "BaseAdminMVC.Areas.BaseAdmin.Controllers", "BaseAdminMVC.Areas.TitomsAdmin.Controllers";

            routes.IgnoreRoute("resource.axd/*pathInfo");
            routes.MapRoute(
                "Default", // Route name
                "controller/action/id", // URL with parameters
                new  controller = "Home", action = "Index", id = UrlParameter.Optional ,
                namespaces
            );
          

顺便说一句,我在Area 文件夹之外还有控制器(“HomeController”)。这只是提供了两个项目BaseAdminTitomsAdmin 的链接。

我已经尝试过这个解决方案,但仍然不起作用

routes.IgnoreRoute("resource.axd/*pathInfo");
            routes.MapRoute(
                "Default", // Route name
                "controller/action/id", // URL with parameters
                new  controller = "Home", action = "Index", id = UrlParameter.Optional 
            );

            routes.MapRoute(
                "BaseAdmin",
                "BaseAdmin/controller/action",
                new  controller = "Account", action = "Index" ,
                new string[]  "BaseAdminMVC.Areas.BaseAdmin.Controllers" 
            );

            routes.MapRoute(
                "TitomsAdmin",
                "TitomsAdmin/controller/action",
                new  controller = "Home", action = "Index" ,
                new string[]  "BaseAdminMVC.Areas.TitomsAdmin.Controllers" 
            );

提前致谢!!

【问题讨论】:

重新编辑:您必须将默认路线向下移动(到最后一个位置)。顺序在这里很重要。 @HenkHolterman 还是没用。 目前还不清楚“不起作用”是什么意思。 是的。实际上我已经解决了这个问题,但我不知道解决方案是如何成为可能的,而第一个解决方案最有可能但没有奏效。好吧,你说得对,顺序很重要。感谢您的帮助! 【参考方案1】:

我不知道发生了什么,但是这段代码可以正常工作:

public static void RegisterRoutes(RouteCollection routes)

    routes.IgnoreRoute("resource.axd/*pathInfo");
    routes.MapRoute(
        "Default", // Route name
        "controller/action/id", // URL with parameters
        new  controller = "Home", action = "Index", id = UrlParameter.Optional ,
        new string[]  "BaseAdminMVC.Areas.TitomsAdmin.Controllers" 
    );

【讨论】:

刚刚加入..(我知道已经晚了一年),但我收到了这个错误,因为我更改了输出程序集的名称和默认命名空间。我将旧的编译程序集(来自 MVC3 站点)留在了项目的 debug/bin 文件夹中而没有意识到。当站点加载时,它会从旧程序集和新重命名的程序集中获取主控制器,并抛出与您相同的错误。长话短说,我进入垃圾箱,移除了旧组件,一切都开始正常工作了。 谢谢!我现在正在从 4.0 迁移到 .Net 4.5。如果再次出现同样的错误,您的提示可能会有所帮助。 @OFConsulting 我知道我不应该在评论中说“谢谢”,但是 FU--*- THANKS ! 当然,此评论需要成为对此的默认答案。 ASP.NET MVC 5 仍然适用。 @OFConsulting:您的解决方案对我来说是正确的。尽管我可以通过指定命名空间使其工作,但我宁愿解决根本原因以避免未来的混乱。话虽这么说,如果有人真的需要在同一个命名空间中有两个控制器,那么他们应该使用上面的答案。【参考方案2】:

重命名项目命名空间/程序集后出现此错误。

如果您重命名了命名空间/程序集,您的 bin 文件夹中可能有一个旧名称的剩余程序集/dll。只需从那里删除它,它应该可以工作。

【讨论】:

【参考方案3】:

右键单击项目并选择清理项目。或者完全清空 bin 目录,然后重新构建。这应该清除任何剩余的程序集

【讨论】:

以上是关于找到了与名为“Home”的控制器匹配的多种类型 - 在两个不同的区域中的主要内容,如果未能解决你的问题,请参考以下文章

命名空间更改 - 找到与名为“Home”的控制器匹配的多种类型

MVC5 找到与名为“Home”的控制器匹配的多种类型

发现多个类型的家庭控制器

找到了多个与名为“帐户”的控制器匹配的类型。 MVC 4 & 使用 RouteConfig.CS

找到多个与名为“Home”的控制器匹配的类型

找到多个与名为“Home”的控制器匹配的类型