Having issue with multiple controllers of the same name in my project
Asked Answered
R

13

99

I am running into the following error with my ASP.NET MVC 3 project:

Multiple types were found that match the controller named 'Home'. This can happen if the route that services this request ('Home/{action}/{id}') does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.

The request for 'Home' has found the following matching controllers: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

I have a HomeController in my default controller folder, with a class name of MyCompany.MyProject.WebMvc.Controllers.HomeController.

My RegisterRoutes method, in my global.asax, looks like:

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

I then have an area called Company, with a HomeController in the default controller folder for the area, with a class name of MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

The RegisterArea method in the CompanyAreaRegistration file looks like:

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

This is all leading the error I highlighted at the beginning of this post. I am struggling trying to piece together a solution from various other posts, with NO LUCK.

Is it possible to have a HomeController in the default controllers folder and then one in EACH area? If so, do I need to make (assuming I do) changes to my configuration file to make this work?

Any help would be much appreciated!

Rouble answered 23/2, 2011 at 15:0 Comment(2)
Refer this https://mcmap.net/q/93152/-multiple-types-were-found-that-match-the-controller-named-39-home-39. It works for meTriceratops
This happen to me when I renamed the project/assembly, I just deleted the bin folder and recompile the project and it worked fine.Unstoppable
J
172

The error message contains the recommended solution: "If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter."

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

This will make http://server/ go to your HomeController's Index action which is, I think, what you want. http://server/company/home will go to the Company area's HomeController's Index action, as defined in the area registration.

Jasso answered 23/2, 2011 at 15:19 Comment(8)
I haven't tested it, but the namespaces parameter is a string array, so you should be able to pass any number by adding to the array: new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }Jasso
That namespace pattern didn't work for me. MyProject.Controllers did however.Handfast
I tried this one. But the index in this MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerclass is executing. But the View appears is the old one.Tortosa
Worth nothing that the 4th parameter here can be a bit confusing because of type inference and variable meaning. The 4th parameter can be a string array to constrain by namespace, an object to add IRouteConstraints OR strings that can be interpreted as constraints, or you can have 5 parameters and include both. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…Phyllys
Also worth noting a path will find its way to other namespaces by default - if you want to lock a path to a namespace or set of namespaces you have to disable this fallback: bubblogging.wordpress.com/2012/06/09/mvc-routing-namespaces (bottom of page)Phyllys
@jenson-button-event everyone loves some stringly typed dataEugenieeugenio
The strings can of course be defined anywhere, including using reflection to grab the namespace. To add that complexity into an answer that simply shows an example of calling an overload seems unnecessary. The community can certainly feel free to edit the answer if they feel that would be helpful.Jasso
Instead of entering a hard coded namespace string you can do this: namespaces: new[] { typeof(HomeController).Namespace }Hesperus
V
30

This is the asp.net mvc4 approach:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );
Venusberg answered 27/3, 2013 at 3:53 Comment(3)
thanks, this solved it for me, though I can't figure out for the life of me why my application thinks there are two home controllers in the first place. I did a search & replace of the namespace, which appears to have caused the problem, but a search of the entire solution doesn't show any instances of the rogue namespace.Emboly
Well, I found the cause of my problem. Hopefully this may help someone else desperately searching, as I was today. Because I had changed the name of the application (as well as the namespace), there was still a DLL left in the bin folder that didn't get deleted by a clean. There must be some MEF magic going on under the covers. As soon as I discovered & deleted the old DLL, the problem went away. No wonder a text search didn't find it!Emboly
@YannDuran, ran into a similar problem and your fixed helped. Thanks.Ibert
B
13

I had renamed the namespaces, so, i only delete de folders bin and obj and rebuild, work again.

Barnwell answered 6/12, 2016 at 13:22 Comment(0)
S
3

If you're using RazorGenerator, just informing the namespaces parameter could be not enough.

I got to solve adding the statement marked below at 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
    }
Sims answered 17/8, 2016 at 5:4 Comment(0)
S
2

Another plausible cause of this issue could be found below:

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

Scrivenor answered 24/9, 2013 at 10:58 Comment(0)
C
2

use this

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "ProjectName.Controllers" }
        );
Cilia answered 24/10, 2013 at 7:37 Comment(0)
W
1

Use only the name of the project:

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
Waitress answered 9/10, 2013 at 8:43 Comment(0)
H
1

I had the same issue and found that the older version had created compiled files in the "bin" folder.

Once I deleted these the error disappeared.

Hotze answered 24/7, 2020 at 17:10 Comment(1)
Deleting the contents of the "bin" and the "obj" folder did the job for me.Costanzia
F
0

As Chris Moschini mention the namespaces parameter may not be enough if you have two areas with same controller name with different namespaces and the default none area route will return 500 server error.

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

It "best" to override the default route handler and add this line:

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;
Flowerer answered 10/4, 2018 at 12:49 Comment(0)
C
0

I had this issue after I added a reference to another project that had the same routes and the problem continued after I removed the reference.

Resolved by deleting the .dll file of that added reference from the bin folder and rebuilding.

Chainplate answered 12/4, 2019 at 15:14 Comment(0)
B
0

Like many others, I had this problem after creating a new MVC template project from VS2017 menu, on building the project I would get the op's error message. I then used the answer https://mcmap.net/q/216084/-having-issue-with-multiple-controllers-of-the-same-name-in-my-project posted earlier in this thread by cooloverride for mvc4 projects. This still didn't fix my issue so I renamed my Home view folder and HomeController file to be the view folder Company/ and controller file CompanyController. This then worked for me, not a fix per say but a workaround if your not stuck on having the route Home/Index my other issue was I couldn't find the reference causing the error and due to my dev platform being Azure WebApplication vs a full VM with a complete file system and IIS settings to mess with.

Battlefield answered 10/8, 2019 at 4:31 Comment(0)
T
0

For MVC5 below code works for issue same controller name for different areas. You have to specify which area controller have to hit first.

        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");
Taeniafuge answered 20/11, 2020 at 11:39 Comment(0)
B
0

This issue occurred when I accidentally added

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

instead of

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

to the top of my ApiController.

Bearden answered 9/11, 2021 at 14:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.