J'ai un problème avec plusieurs contrôleurs du même nom dans mon projet

96

Je rencontre l'erreur suivante avec mon projet ASP.NET MVC 3:

Plusieurs types ont été trouvés qui correspondent au contrôleur nommé «Home». Cela peut se produire si la route qui traite cette demande ('Home / {action} / {id}') ne spécifie pas d'espaces de noms pour rechercher un contrôleur qui correspond à la demande. Si tel est le cas, enregistrez cette route en appelant une surcharge de la méthode 'MapRoute' qui prend un paramètre 'namespaces'.

La demande "Accueil" 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 alors une zone appelée Company, 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 dans le fichier CompanyAreaRegistration ressemble à ceci:

   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 soulignée au début de cet article. J'ai du mal à essayer de trouver une solution à partir de divers autres messages, sans aucune chance .

Est-il possible d'avoir un HomeController dans le dossier des contrôleurs par défaut, puis un dans CHAQUE zone? Si tel est le cas, dois-je apporter des modifications (en supposant que je le fasse) à mon fichier de configuration pour que cela fonctionne?

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

mattruma
la source
Reportez-vous à ce stackoverflow.com/a/12633541/2089963 . Ça marche pour moi
Syed Mohamed
Cela m'est arrivé lorsque j'ai renommé le projet / l'assemblage, je viens de supprimer le dossier bin et de recompiler le projet et cela a bien fonctionné.
Core

Réponses:

167

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' qui prend 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 string[] { "MyCompany.MyProject.WebMvc.Controllers"}
);

Cela permettra à http: // server / d' accéder à l'action Index de votre HomeController qui est, je pense, ce que vous voulez. http: // server / company / home ira à l'action Index du HomeController de la zone Société, comme défini dans l'enregistrement de la zone.

David Ruttka
la source
1
Je ne l'ai pas testé, mais le namespacesparamètre est un tableau de chaînes, vous devriez donc pouvoir passer n'importe quel nombre en ajoutant au tableau:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka
2
Ce modèle d'espace de noms n'a pas fonctionné pour moi. MyProject.Controllersfait cependant.
The Muffin Man
J'ai essayé celui-ci. Mais l'index de cette MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerclasse est en cours d'exécution. Mais la vue qui apparaît est l'ancienne.
kbvishnu
Cela ne vaut rien que le 4ème paramètre ici puisse être un peu déroutant en raison de l'inférence de type et de la signification des variables. Le 4ème paramètre peut être un tableau de chaînes à contraindre par espace de noms, un objet pour ajouter des chaînes IRouteConstraints OU qui peuvent être interprétées comme des contraintes, ou vous pouvez avoir 5 paramètres et inclure les deux. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris Moschini
Il convient également de noter qu'un chemin trouvera son chemin vers d'autres espaces de noms par défaut - si vous souhaitez verrouiller un chemin vers un espace de noms ou un ensemble d'espaces de noms, vous devez désactiver cette solution de secours: bubblogging.wordpress.com/2012/06/09/mvc- routing-namespaces (bas de page)
Chris Moschini
30

Voici 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" }
        );
cooloverride
la source
2
merci, cela a résolu le problème pour moi, même si je ne peux pas comprendre pour la vie de moi pourquoi mon application pense qu'il y a deux contrôleurs domestiques en premier lieu. J'ai effectué une recherche et un remplacement de l'espace de noms, ce qui semble avoir causé le problème, mais une recherche de la solution entière ne montre aucune instance de l'espace de noms non autorisé.
Yann Duran
12
Eh bien, j'ai trouvé la cause de mon problème. J'espère que cela aidera quelqu'un d'autre à chercher désespérément, comme je l'étais aujourd'hui. Parce que j'avais changé le nom de l'application (ainsi que l'espace de noms), il restait encore une DLL dans le dossier bin qui n'a pas été supprimée par un nettoyage. Il doit y avoir de la magie MEF sous les couvertures. Dès que j'ai découvert et supprimé l'ancienne DLL, le problème a disparu. Pas étonnant qu'une recherche textuelle ne l'ait pas trouvée!
Yann Duran
@YannDuran, a rencontré un problème similaire et votre correction a aidé. Merci.
Klaus Nji
12

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

Reynaldo
la source
2

utilisez ceci

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

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
glownet
la source
1

Si vous utilisez RazorGenerator, informez simplement le namespaces paramètre peut ne pas suffire.

Je dois résoudre en ajoutant la déclaration indiquée 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
    }
Leonel Sanches da Silva
la source
0

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 la route aucune zone par défaut renverra une erreur de serveur 500.

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

Il est "préférable" de remplacer le gestionnaire d'itinéraire par défaut et d'ajouter cette ligne:

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;
XzaR
la source
0

J'ai eu ce problème après avoir ajouté une référence à un autre projet qui avait les mêmes itinéraires et le problème a continué après avoir supprimé la référence.

Résolu en supprimant le fichier .dll de cette référence ajoutée du dossier bin et en le reconstruisant.

Logan Miller
la source
0

Comme beaucoup d'autres, j'ai eu ce problème après avoir créé un nouveau projet de modèle MVC à partir du menu VS2017, lors de la construction du projet, j'obtiendrais le message d'erreur de l'opération. J'ai ensuite utilisé la réponse https://stackoverflow.com/a/15651619/2417292 publiée plus tôt dans ce fil par cooloverride pour les projets mvc4. Cela n'a toujours pas résolu mon problème, j'ai donc renommé mon dossier de vue d'accueil et mon fichier HomeController en dossier de vue Company / et fichier de contrôleur CompanyController. Cela a ensuite fonctionné pour moi, pas un correctif en soi, mais une solution de contournement si vous n'êtes pas bloqué sur l'itinéraire Accueil / Index mon autre problème était que je ne trouvais pas la référence à l'origine de l'erreur et que ma plate-forme de développement était Azure WebApplication par rapport à un VM complète avec un système de fichiers complet et des paramètres IIS pour jouer avec.

Eddie.Power_AU
la source
0

J'ai eu le même problème et j'ai trouvé que l'ancienne version avait créé des fichiers compilés dans le dossier "bin".

Une fois que j'ai supprimé ces derniers, l'erreur a disparu.

Pavan Arunod
la source