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

问题描述 投票:93回答:9

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

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

对'Home'的请求找到了以下匹配的控制器: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,然后在每个区域有一个?如果是这样,我是否需要对我的配置文件进行更改(假设我这样做)才能使其正常工作?

任何帮助将非常感激!

asp.net-mvc asp.net-mvc-3 asp.net-mvc-areas
9个回答
163
投票

错误消息包含建议的解决方案:“如果是这种情况,请通过调用带有'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的索引操作。


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

10
投票

我已经重命名了名称空间,所以,我只删除de folders bin和obj并重建,再次工作。


2
投票

这个问题的另一个可能的原因可以在下面找到:

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


2
投票

用这个

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

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

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
    }

0
投票

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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.