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

asp.net Mvcasp.net Mvc-3asp.net Mvc-Areas

asp.net Mvc Problem Overview


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!

asp.net Mvc Solutions


Solution 1 - asp.net Mvc

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.

Solution 2 - asp.net Mvc

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

Solution 3 - asp.net Mvc

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

Solution 4 - asp.net Mvc

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
    }

Solution 5 - asp.net Mvc

Solution 6 - asp.net Mvc

use this

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

Solution 7 - asp.net Mvc

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

Solution 8 - asp.net Mvc

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.

Solution 9 - asp.net Mvc

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;

Solution 10 - asp.net Mvc

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.

Solution 11 - asp.net Mvc

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://stackoverflow.com/a/15651619/2417292 posted earlier in this thread by [cooloverride][1] [1]: https://stackoverflow.com/users/2214172/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.

Solution 12 - asp.net Mvc

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

Solution 13 - asp.net Mvc

This issue occurred when I accidentally added

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

instead of

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

to the top of my ApiController.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmattrumaView Question on Stackoverflow
Solution 1 - asp.net MvcDavid RuttkaView Answer on Stackoverflow
Solution 2 - asp.net MvccooloverrideView Answer on Stackoverflow
Solution 3 - asp.net MvcReynaldoView Answer on Stackoverflow
Solution 4 - asp.net MvcLeonel Sanches da SilvaView Answer on Stackoverflow
Solution 5 - asp.net MvcT GuptaView Answer on Stackoverflow
Solution 6 - asp.net MvccrackerView Answer on Stackoverflow
Solution 7 - asp.net MvcglownetView Answer on Stackoverflow
Solution 8 - asp.net MvcPavan SomarathneView Answer on Stackoverflow
Solution 9 - asp.net MvcXzaRView Answer on Stackoverflow
Solution 10 - asp.net MvcLogan MillerView Answer on Stackoverflow
Solution 11 - asp.net MvcEddie.Power_AUView Answer on Stackoverflow
Solution 12 - asp.net MvcPrince Painadath JoseView Answer on Stackoverflow
Solution 13 - asp.net MvcEsaithView Answer on Stackoverflow