Avoir des problèmes avec plusieurs contrôleurs du même nom dans mon projet

Je suis en train de rencontrer l’erreur suivante avec mon projet ASP.NET MVC 3:

Plusieurs types correspondant au contrôleur nommé «Home» ont été trouvés. Cela peut se produire si la route qui dessert cette requête (‘Home / {action} / {id}’) ne spécifie pas les espaces de noms pour rechercher un contrôleur correspondant à la requête. Si tel est le cas, enregistrez cette route en appelant une surcharge de la méthode ‘MapRoute’ prenant un paramètre ‘namespaces’.

La demande de «Home» a trouvé les contrôleurs correspondants suivants: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

J’ai un HomeController dans mon dossier de contrôleur par défaut, avec un nom de classe MyCompany.MyProject.WebMvc.Controllers.HomeController.

Ma méthode RegisterRoutes, dans mon global.asax, ressemble à:

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

J’ai ensuite une zone appelée Société, avec un HomeController dans le dossier du contrôleur par défaut pour la zone, avec un nom de classe MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

La méthode RegisterArea du fichier CompanyAreaRegistration ressemble à:

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

Tout cela mène à l’erreur que j’ai mise en évidence au début de cet article. Je me bats pour essayer de rassembler une solution de divers autres postes, avec NO LUCK .

Est-il possible d’avoir un HomeController dans le dossier des contrôleurs par défaut, puis un dans chaque zone? Si oui, dois-je modifier (en supposant que je fais) des modifications dans mon fichier de configuration pour que cela fonctionne?

Toute aide serait très appréciée!

Le message d’erreur contient la solution recommandée: “Si tel est le cas, enregistrez cette route en appelant une surcharge de la méthode ‘MapRoute’ prenant un paramètre ‘namespaces’.”

 routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults new ssortingng[] { "MyCompany.MyProject.WebMvc.Controllers"} ); 

Cela fera http: // server / va à l’action Index de votre HomeController qui est, je pense, ce que vous voulez. http: // server / company / home ira à l’action Index de HomeController de la zone Société, telle que définie dans l’enregistrement de la zone.

Ceci est l’approche asp.net mvc4:

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

J’avais renommé les espaces de noms, donc, je ne supprime que les dossiers bin et obj et reconstruit , fonctionne à nouveau.

Une autre cause plausible de ce problème peut être trouvée ci-dessous:

Plusieurs types correspondant au contrôleur nommé «Home» ont été trouvés

utilisez ceci

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

Utilisez uniquement le nom du projet:

 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 

Si vous utilisez RazorGenerator, le simple fait d’informer le paramètre namespaces peut ne pas suffire.

Je dois résoudre l’ajout de la déclaration ci-dessous à 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 } 

Comme Chris Moschini le mentionne, le paramètre namespaces peut ne pas être suffisant si vous avez deux zones avec le même nom de contrôleur avec des espaces de noms différents et que la route par défaut none renvoie 500 erreurs de serveur.

 routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults new ssortingng[] { "MyCompany.MyProject.WebMvc.Controllers"} ); 

Il est “préférable” de remplacer le gestionnaire de route par défaut et d’append cette ligne:

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