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

时间:2011-02-23 15:00:33

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-areas

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

  

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

     

'Home'的请求找到了   以下匹配控制器:   MyCompany.MyProject.WebMvc.Controllers.HomeController   MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

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

我的globalRastes方法,在我的global.asax中,看起来像:

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

这是我在本文开头突出显示的错误。我正在努力拼凑其他各种帖子的解决方案, NO LUCK

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

非常感谢任何帮助!

12 个答案:

答案 0 :(得分:162)

错误消息包含推荐的解决方案:“如果是这种情况,请通过调用带有'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的索引动作,我认为这是你想要的。 http://server/company/home将转到公司区域的HomeController的Index操作,如区域注册中所定义。

答案 1 :(得分:28)

这是asp.net mvc4方法:

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

答案 2 :(得分:9)

我已重命名名称空间,因此,我只删除 de文件夹 bin obj 以及重建,再次工作。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

使用此

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

答案 5 :(得分:1)

仅使用项目名称:

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

答案 6 :(得分:1)

如果您使用的是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
    }

答案 7 :(得分:0)

正如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;

答案 8 :(得分:0)

在添加对具有相同路线的另一个项目的引用后,出现了此问题,并且在删除引用后问题仍然存在。

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

删除这些错误后,错误消失了。

答案 11 :(得分:0)

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