Problema con più controller con lo stesso nome nel mio progetto

Sto correndo il seguente errore con il mio progetto ASP.NET MVC 3:

Sono stati trovati più tipi che corrispondono al controller denominato “Home”. Ciò può accadere se la route che fornisce questa richiesta (‘Home / {action} / {id}’) non specifica gli spazi dei nomi per cercare un controller che corrisponda alla richiesta. In tal caso, registrare questa rotta chiamando un overload del metodo “MapRoute” che accetta un parametro “namespaces”.

La richiesta di ‘Home’ ha trovato i seguenti controller di corrispondenza: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

Ho un HomeController nella mia cartella del controller di default, con un nome di class di MyCompany.MyProject.WebMvc.Controllers.HomeController.

Il mio metodo RegisterRoutes, nel mio global.asax, assomiglia a:

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

Poi ho un’area chiamata Company, con un HomeController nella cartella del controller di default per l’area, con un nome di class di MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

Il metodo RegisterArea nel file CompanyAreaRegistration ha il seguente aspetto:

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

Questo è tutto ciò che porta l’errore che ho evidenziato all’inizio di questo post. Sto lottando cercando di mettere insieme una soluzione da vari altri post, con NO FORTUNA .

È ansible avere un HomeController nella cartella dei controller di default e quindi uno in OGNI area? In tal caso, devo apportare modifiche (supponendo che lo faccia) al mio file di configurazione per farlo funzionare?

Qualsiasi aiuto sarebbe molto apprezzato!

Il messaggio di errore contiene la soluzione consigliata: “Se questo è il caso, registrare questa rotta chiamando un overload del metodo” MapRoute “che accetta un parametro” 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"} ); 

Questo renderà http: // server / go all’azione Index del tuo HomeController che è, penso, quello che vuoi. http: // server / company / home andrà all’azione Index di HomeController dell’area della società, come definito nella registrazione dell’area.

Questo è l’approccio mvc4 di asp.net:

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

Avevo ribattezzato lo spazio dei nomi, quindi, ho solo eliminato de folders bin e obj e ricostruisci , lavoro di nuovo.

Un’altra causa plausibile di questo problema potrebbe essere trovata di seguito:

Sono stati trovati più tipi che corrispondono al controller denominato “Home”

Usa questo

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

Usa solo il nome del progetto:

 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 

Se stai usando RazorGenerator, solo informare il parametro namespaces potrebbe non essere sufficiente.

Devo risolvere aggiungendo la dichiarazione riportata di seguito in 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 } 

Poiché Chris Moschini menziona il parametro namespaces potrebbe non essere sufficiente se si dispone di due aree con lo stesso nome controller con spazi dei nomi diversi e la route senza area predefinita restituirà 500 errori del server.

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

È meglio “scavalcare” il gestore di route predefinito e aggiungere questa linea:

 RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;