web-dev-qa-db-fra.com

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

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

Plusieurs types correspondent au contrôleur nommé 'Home'. Cela peut arriver si la route qui dessert cette demande ('Home/{action}/{id}') ne spécifie pas d'espaces de nom pour rechercher un contrôleur correspondant à 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 de '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 de MyCompany.MyProject.WebMvc.Controllers.HomeController.

Ma méthode RegisterRoutes, dans mon global.asax, se présente comme suit:

    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 de MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

La méthode RegisterArea dans le fichier CompanyAreaRegistration se présente comme suit:

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

C'est tout ce qui mène à l'erreur que j'ai soulignée au début de ce post. Je ne parviens pas à 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 tel est le cas, dois-je apporter (en supposant que je le fasse) des modifications à mon fichier de configuration pour que cela fonctionne?

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

94
mattruma

Le message d'erreur contient la solution recommandée: "Dans ce cas, enregistrez cette route en appelant une surcharge de la méthode" MapRoute "qui prend un paramètre" d'espaces de nommage "."

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 fera http: // serveur / aller à l'action Index de votre HomeController qui correspond, je pense, à ce que vous voulez. http: // serveur/société/home va accéder à l'action Index HomeController de la zone Société, telle que définie dans l'enregistrement de zone.

164
David Ruttka

C'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" }
        );
29
cooloverride

J'avais renommé les espaces de noms, donc je n'ai que supprimer de dossiers bin et obj et reconstruire, fonctionne à nouveau.

10
Reynaldo

utilisez ceci

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

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

Plusieurs types correspondent au contrôleur nommé 'Home'

2
T Gupta

Si vous utilisez RazorGenerator, le simple fait d'informer le paramètre namespaces risque de ne pas suffire.

Je dois résoudre en ajoutant la déclaration marqué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
    }
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
1
glownet

Comme Chris Moschini le mentionne, le paramètre d'espaces de nommage peut ne pas être suffisant si vous avez deux zones portant le même nom de contrôleur avec des espaces de noms différents et que la route par défaut aucune zone renverra une erreur de 500 serveur.

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 de route par défaut et d’ajouter cette ligne:

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

J'ai eu ce problème après avoir ajouté une référence à un autre projet ayant les mêmes itinéraires et le problème a continué après que j'ai 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.

0
Logan Miller

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, le message d'erreur de l'opérateur m'était renvoyé. J'ai ensuite utilisé la réponse https://stackoverflow.com/a/15651619/2417292 posté 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 Accueil et mon fichier HomeController en dossier de vue Société/et fichier de contrôleur CompanyController. Cela a ensuite fonctionné pour moi, pas une solution à proprement parler, mais une solution de contournement si vous n'êtes pas bloqué sur l'itinéraire. full VM avec un système de fichiers complet et IIS avec lesquels vous voulez jouer.

0
Eddie.Power_AU