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

mat*_*uma 94 asp.net-mvc asp.net-mvc-areas asp.net-mvc-3

我的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
        );
    }
Run Code Online (Sandbox Code Playgroud)

然后我有一个名为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 }
        );
    }
Run Code Online (Sandbox Code Playgroud)

这就是我在本文开头突出显示的错误.我正在努力拼凑其他各种帖子的解决方案,没有运气.

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

任何帮助将非常感激!

Dav*_*tka 165

错误消息包含建议的解决方案:"如果是这种情况,请通过调用带有'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"}
);
Run Code Online (Sandbox Code Playgroud)

这将使http:// server /转到你的HomeController的Index动作,我想,这就是你想要的.http:// server/company/home将转到公司区域的HomeController的Index操作,如区域注册中所定义.

  • 试过这个就行了!谢谢! (2认同)
  • 该命名空间模式对我不起作用。但是MyProject.Controllers做到了。 (2认同)

小智 29

这是asp.net mvc4方法:

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

  • 好吧,我找到了问题的原因.希望这可以帮助别人拼命搜索,就像我今天一样.因为我已经更改了应用程序的名称(以及命名空间),所以bin文件夹中仍然有一个DLL没有被clean删除.必须有一些MEF魔法在幕后进行.一旦我发现并删除了旧的DLL,问题就消失了.难怪文字搜索没有找到它! (11认同)
  • 谢谢,这解决了我,虽然我无法弄清楚为什么我的应用程序认为首先有两个家庭控制器.我进行了搜索和替换命名空间,这似乎导致了问题,但搜索整个解决方案并未显示任何恶意命名空间的实例. (2认同)

Rey*_*ldo 10

我已经重命名了名称空间,所以,我只删除 de folders binobj重建,再次工作.