Asp.net mvc 我的项目中有多个同名控制器出现问题

Asp.net mvc 我的项目中有多个同名控制器出现问题,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-areas,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc Areas,我的ASP.NET MVC 3项目遇到以下错误: 找到了多个匹配的类型 名为“Home”的控制器。这个可以 如果服务于此的路由 请求('Home/{action}/{id}')没有 不指定要搜索的名称空间 与请求匹配的控制器。 如果是这种情况,请注册此 通过调用 “MapRoute”方法,该方法采用 “名称空间”参数 routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL w

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

找到了多个匹配的类型 名为“Home”的控制器。这个可以 如果服务于此的路由 请求('Home/{action}/{id}')没有 不指定要搜索的名称空间 与请求匹配的控制器。 如果是这种情况,请注册此 通过调用 “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"}
);
“主页”请求已找到 以下匹配控制器: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controller.HomeController

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

My 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
        );
    }
   public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Company_default",
            "Company/{controller}/{action}/{id}",
            new { area = "Company", action = "Index", id = UrlParameter.Optional }
        );
    }
然后,我有一个名为Company的区域,该区域的默认控制器文件夹中有一个HomeController,类名为MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

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

    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
        );
    }
   public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Company_default",
            "Company/{controller}/{action}/{id}",
            new { area = "Company", action = "Index", id = UrlParameter.Optional }
        );
    }
这就是我在本文开头强调的错误。我正努力从其他帖子中拼凑出一个解决方案,运气不佳

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


任何帮助都将不胜感激

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


这将使你的家庭控制器的索引行动,我想,这是你想要的。将转到公司区域的HomeController索引操作,如区域注册中所定义

这是asp.net mvc4方法:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );
该问题的另一个可能原因如下:


仅使用项目名称:

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
用这个

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

如果您使用的是RazorGenerator,仅通知
名称空间
参数是不够的

我必须解决添加下面标记在
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
    }

我已经重命名了名称空间,因此,我只删除de文件夹binobj重建,再次工作。

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

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;

在我添加了对另一个具有相同路径的项目的引用之后,我遇到了这个问题,在我删除了引用之后,问题仍然存在


通过从bin文件夹中删除添加引用的.dll文件并重新生成来解决此问题。

与其他许多人一样,在从VS2017菜单创建新的MVC模板项目后,我遇到了此问题,在构建项目时,我会收到op的错误消息。然后我使用了本帖前面发布的答案 对于mvc4项目。
这仍然无法解决我的问题,因此我将我的主视图文件夹和HomeController文件重命名为视图文件夹公司/和控制器文件公司控制器。这对我来说很管用,这不是一个修复方案,而是一个解决方案,如果你没有坚持路由回家/索引,我的另一个问题是我找不到导致错误的参考,因为我的开发平台是Azure WebApplication,而不是一个完整的虚拟机,有完整的文件系统和IIS设置要处理。

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


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

对于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");

我没有测试它,但是
namespaces
参数是一个字符串数组,因此您应该能够通过添加到数组中来传递任何数字:
newstring[]{“MyCompany.MyProject.WebMvc.Controllers”、“My.Second.Namespace”、“My.Third.Namespace”、“namespaces.Etc”}
该命名空间模式对我不起作用
MyProject.Controllers
做了。我尝试了这个。但是这个
MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController
类中的索引正在执行。但是这个视图看起来是旧的。毫无价值,因为类型推断和变量含义,这里的第四个参数可能有点混乱。第四个参数可以是要按名称空间进行约束的字符串数组、要添加IRouteConstraints的对象或可以解释为约束的字符串,也可以有5个参数并同时包含这两个参数。另外值得注意的是,默认情况下,路径将找到通往其他名称空间的路径-如果您想锁定指向某个名称空间或一组名称空间的路径,则必须禁用此回退:(页面底部)谢谢,这为我解决了这个问题,尽管我一辈子都不明白为什么我的应用程序认为首先有两个主控制器。我搜索并替换了名称空间,这似乎是导致问题的原因,但搜索整个解决方案时没有显示任何恶意名称空间的实例。嗯,我找到了问题的原因。希望这能帮助其他人拼命寻找,就像我今天这样。因为我已经更改了应用程序的名称(以及名称空间),所以bin文件夹中仍然有一个DLL,没有被一个干净的应用程序删除。一定有一些MEF的魔术在幕后进行。我一发现并删除旧的DLL,问题就消失了。难怪文本搜索没有找到它@Yanduran遇到了类似的问题