在我的项目中存在多个同名控制器的问题

Posted

技术标签:

【中文标题】在我的项目中存在多个同名控制器的问题【英文标题】:Having issue with multiple controllers of the same name in my project 【发布时间】:2011-02-23 15:00:33 【问题描述】:

我的 ASP.NET MVC 3 项目遇到以下错误:

找到多个匹配的类型 名为“Home”的控制器。这个可以 如果服务于此的路线发生 request ('Home/action/id') 确实 不指定名称空间来搜索 匹配请求的控制器。 如果是这种情况,请注册此 通过调用的重载路由 'MapRoute' 方法采用 “命名空间”参数。

“主页”请求已找到 以下匹配的控制器: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

我的默认控制器文件夹中有一个 HomeController,其类名为 MyCompany.MyProject.WebMvc.Controllers.HomeController。

我的 global.asax 中的 RegisterRoutes 方法如下所示:

    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  // Parameter defaults
        );
    

然后我有一个名为 Company 的区域,该区域的默认控制器文件夹中有一个 HomeController,其类名为 MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController。

CompanyAreaRegistration 文件中的 RegisterArea 方法如下所示:

   public override void RegisterArea(AreaRegistrationContext context)
    
        context.MapRoute(
            "Company_default",
            "Company/controller/action/id",
            new  area = "Company", action = "Index", id = UrlParameter.Optional 
        );
    

这一切都导致了我在本文开头强调的错误。我正在努力尝试从其他各种帖子中拼凑出一个解决方案,没有运气

是否可以在默认控制器文件夹中拥有一个 HomeController,然后在每个区域中拥有一个?如果是这样,我是否需要(假设我这样做)更改我的配置文件以使其工作?

任何帮助将不胜感激!

【问题讨论】:

请参阅此***.com/a/12633541/2089963。它对我有用 当我重命名项目/程序集时发生这种情况,我只是删除了 bin 文件夹并重新编译项目,它工作正常。 【参考方案1】:

错误消息包含推荐的解决方案:“如果是这种情况,请通过调用采用 'namespaces' 参数的 'MapRoute' 方法的重载来注册此路由。”

routes.MapRoute(
     "Default", // Route name
     "controller/action/id", // URL with parameters
     new  controller = "Home", action = "Index", id = UrlParameter.Optional , // Parameter defaults
     new string[]  "MyCompany.MyProject.WebMvc.Controllers"
);

这将使http://server/ 转到您的 HomeController 的 Index 操作,我认为这就是您想要的。 http://server/company/home 将转到公司区域的 HomeController 的索引操作,如区域注册中所定义。

【讨论】:

我没有测试过,但是namespaces参数是一个字符串数组,所以你应该可以通过添加到数组中传递任意数字:new string[] "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" 那个命名空间模式对我不起作用。但是MyProject.Controllers 做到了。 我试过这个。但是这个MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerclass 中的索引正在执行。但出现的视图是旧视图。 由于类型推断和变量含义,这里的第 4 个参数可能会有点混乱,这没什么。第 4 个参数可以是一个按命名空间进行约束的字符串数组,一个添加 IRouteConstraints 的对象或可以解释为约束的字符串,或者您可以有 5 个参数并同时包含这两个参数。 aspnetwebstack.codeplex.com/SourceControl/changeset/view/… 另外值得注意的是,默认情况下,路径会找到通往其他命名空间的路径 - 如果你想锁定一个命名空间或一组命名空间的路径,你必须禁用这个后备:bubblogging.wordpress.com/2012/06/09/mvc-routing-namespaces(底部页)【参考方案2】:

这是asp.net mvc4的方法:

 routes.MapRoute(
            name: "Default",
            url: "controller/action/id",
            defaults: new  controller = "Home", action = "RegisterNow", id = UrlParameter.Optional ,
            namespaces: new[]  "YourCompany.Controllers" 
        );

【讨论】:

谢谢,这为我解决了这个问题,尽管我一生都无法弄清楚为什么我的应用程序首先认为有两个家庭控制器。我对命名空间进行了搜索和替换,这似乎导致了问题,但是搜索整个解决方案并没有显示任何流氓命名空间的实例。 好吧,我找到了问题的原因。希望这可以帮助其他人拼命寻找,就像我今天一样。因为我已经更改了应用程序的名称(以及命名空间),所以 bin 文件夹中仍然有一个 DLL 没有被清理删除。幕后一定有一些 MEF 魔术。一旦我发现并删除了旧的 DLL,问题就消失了。难怪文本搜索没有找到它! @YannDuran,遇到了类似的问题,你的修复帮助了。谢谢。【参考方案3】:

我已经重命名了命名空间,所以,我只删除文件夹binobjrebuild,再次工作。

【讨论】:

【参考方案4】:

如果您使用的是 RazorGenerator,仅仅通知 namespaces 参数可能是不够的。

我要解决在Global.asax.cs添加下面标记的语句:

    protected void Application_Start()
    
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        ControllerBuilder.Current.DefaultNamespaces.Add("MyProject.Controllers"); // This one
    

【讨论】:

【参考方案5】:

此问题的另一个可能原因如下:

Multiple types were found that match the controller named 'Home'

【讨论】:

【参考方案6】:

使用这个

routes.MapRoute(
            "Default",
            "controller/action/id",
            new  controller = "Home", action = "Index", id = UrlParameter.Optional ,
            new[]  "ProjectName.Controllers" 
        );

【讨论】:

【参考方案7】:

仅使用项目名称:

Public Class RouteConfig
    Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("resource.axd/*pathInfo")
        routes.MapRoute( _
            name:="Default", _
            url:="controller/action/id", _
            defaults:=New With .controller = "Home", .action = "Index", .id = UrlParameter.Optional _
           , namespaces:="MvcAreas")  
    End Sub

【讨论】:

【参考方案8】:

我遇到了同样的问题,发现旧版本在“bin”文件夹中创建了编译文件。

一旦我删除了这些,错误就消失了。

【讨论】:

删除“bin”和“obj”文件夹的内容为我完成了这项工作。【参考方案9】:

正如 Chris Moschini 所说,如果您有两个具有相同控制器名称和不同命名空间的区域,并且默认的无区域路由将返回 500 服务器错误,则命名空间参数可能不够。

routes.MapRoute(
     "Default", // Route name
     "controller/action/id", // URL with parameters
     new  controller = "Home", action = "Index", id = UrlParameter.Optional , // Parameter defaults
     new string[]  "MyCompany.MyProject.WebMvc.Controllers"
);

“最好”覆盖默认路由处理程序并添加这一行:

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;

【讨论】:

【参考方案10】:

我在添加对具有相同路由的另一个项目的引用后遇到此问题,并且在删除引用后问题继续存在。

通过从 bin 文件夹中删除添加的引用的 .dll 文件并重新构建来解决。

【讨论】:

【参考方案11】:

像许多其他人一样,我在从 VS2017 菜单创建新的 MVC 模板项目后遇到了这个问题,在构建项目时我会收到操作的错误消息。然后我使用了cooloverride 之前在此线程中发布的答案https://***.com/a/15651619/2417292 对于 mvc4 项目。 这仍然没有解决我的问题,所以我将我的主视图文件夹和 HomeController 文件重命名为视图文件夹 Company/ 和控制器文件 CompanyController。然后这对我有用,不是每个人说的修复方法,而是一种解决方法,如果您没有坚持使用 Home/Index 路线,我的另一个问题是我找不到导致错误的参考,并且由于我的开发平台是 Azure WebApplication vs具有完整文件系统和 IIS 设置的完整 VM。

【讨论】:

【参考方案12】:

对于 MVC5,以下代码适用于为不同区域发出相同的控制器名称。您必须指定必须先击中哪个区域控制器。

        routes.MapRoute(
            name: "Default",
            url: "controller/action/id",
            defaults: new  controller = "Home", action = "Index", id = UrlParameter.Optional ,
             new[]  "ApplicationName.Areas.AreaName.Controllers" 
        ).DataTokens.Add("area", "AreaName");

【讨论】:

【参考方案13】:

这个问题是我不小心添加的时候出现的

[Route("api/[controllers]s")]

而不是

[RoutePrefix("api/[controllers]s")]

到我的 ApiController 的顶部。

【讨论】:

以上是关于在我的项目中存在多个同名控制器的问题的主要内容,如果未能解决你的问题,请参考以下文章

对于 Rails 和 GraphQL 项目,如何定义多个同名查询?

如何在我的 podfile 中为我的 Xcode 项目指定多个目标?

在我的计算机中使用本地主机的多个 wordpress 项目

web项目部署在我的电脑上的tomcat中,怎样让其他用户访问我的项目

web项目部署在我的电脑上的tomcat中,怎样让其他用户访问我的项目

跨多个控制器更新对象/模型