333 votes

Plusieurs types ont été trouvés qui correspondent au contrôleur nommé 'Home'.

J'ai actuellement deux projets MVC3 non liés hébergés en ligne.

L'un fonctionne bien, l'autre ne fonctionne pas, me donnant l'erreur :

Plusieurs types ont été trouvés qui correspondent au contrôleur nommé "Home". Ce peut se produire si la route qui gère cette requête ('{controller}/{action}/{id}') ne spécifie pas les espaces de noms pour rechercher pour rechercher un contrôleur correspondant à la demande.

Si c'est le cas, enregistrez cette route en appelant une surcharge de la méthode 'MapRoute' qui prend un paramètre qui prend un paramètre "namespaces".

La façon dont mon hébergeur fonctionne est qu'il me donne un accès FTP et dans ce dossier, j'ai deux autres dossiers, un pour chacune de mes applications.

ftpFolderA2/foo.com

ftpFolderA2/bar.com

foo.com fonctionne bien, je publie mon application sur mon système de fichiers local puis je transfère le contenu par FTP et cela fonctionne.

Lorsque je télécharge et essaie d'exécuter bar.com, le problème ci-dessus se déclenche et m'empêche d'utiliser mon site. Tout cela alors que foo.com fonctionne toujours .

Est-ce que bar.com cherche des contrôleurs PARTOUT dans ftpFolderA2 et c'est pour cela qu'il trouve un autre contrôleur ? HomeController ? Comment puis-je lui dire de ne regarder que dans le dossier Controller comme il se doit ?

Les faits :

  1. Ne pas utiliser de zones. Ce sont deux projets qui n'ont absolument rien à voir. Je place chaque projet publié dans son dossier respectif. Rien d'extraordinaire.
  2. Chaque projet ne comporte qu'un seul HomeController.

Quelqu'un peut-il confirmer que c'est le problème ?

0 votes

Question très peu claire. Utilisez-vous des zones ? Le problème se pose-t-il au niveau local ?

1 votes

@Darin : J'ai ajouté cette information.

547voto

Kirk Woll Points 34601

Voici un autre scénario dans lequel vous pourriez être confronté à cette erreur. Si vous renommez votre projet de sorte que le nom de fichier de l'assemblage change, il est possible que vous ayez deux versions de votre assemblage ASP.NET, qui reproduiront cette erreur.

La solution est d'aller dans votre bin et supprimez les anciennes dlls (j'ai essayé de "Reconstruire le projet", mais cela ne les a pas supprimées, alors assurez-vous de vérifier que vous n'avez pas de problème avec les dlls). bin pour s'assurer qu'ils sont partis)

1 votes

Une autre variante de cette erreur est lorsque vous utilisez resharper et que vous utilisez certaines options de refactor "auto" qui incluent le changement de nom d'espace de nom. C'est ce qui m'est arrivé.

5 votes

Si vous obtenez ce message à partir d'un service d'application Azure, rendez-vous sur https://<votre_nom_d'application_ici>.scm.azurewebsites.net/DebugConsole pour vous connecter et supprimer les fichiers.

5 votes

Thx c'était le problème pour moi. J'avais créé un "nouveau" projet en copiant/collant un projet existant dans un nouveau dossier ; les anciennes dlls de construction étaient présentes, la suppression du dossier bin l'a nettoyé.

490voto

Darin Dimitrov Points 528142

Ce message d'erreur se produit souvent lorsque vous utilisez des zones et que vous avez le même contrôleur nom à l'intérieur de la zone et de la Racine. Par exemple, vous avez les deux :

  • ~/Controllers/HomeController.cs
  • ~/Areas/Admin/Controllers/HomeController.cs

Afin de résoudre ce problème (comme le message d'erreur vous le suggère), vous pourriez utiliser des espaces de noms lors de la déclaration de vos routes. Ainsi, dans la définition de la route principale dans Global.asax :

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

et dans votre ~/Areas/Admin/AdminAreaRegistration.cs :

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Areas.Admin.Controllers" }
);

Si vous n'utilisez pas de zones, il semble que vos deux applications soient hébergées dans la même application ASP.NET et que des conflits se produisent parce que vous avez les mêmes contrôleurs définis dans des espaces de noms différents. Vous devrez configurer IIS pour héberger ces deux applications en tant qu'applications ASP.NET distinctes si vous voulez éviter ce type de conflits. Demandez à votre fournisseur d'hébergement de le faire si vous n'avez pas accès au serveur.

0 votes

Je n'utilise pas du tout les zones. Il s'agit de deux applications totalement indépendantes qui résident dans des dossiers distincts à l'intérieur d'un dossier racine FTP. Il se peut que mon application recherche des contrôleurs MVC partout où elle le peut et que cette recherche s'étende à l'autre contrôleur domestique. Comment puis-je lui dire de ne pas chercher ailleurs que dans son propre dossier Controller et de ne pas tenir compte du reste ?

2 votes

@SergioTapia, il semble qu'ils soient assez liés à vos applications. Votre hébergeur les a placées dans la même application ASP.NET. Vous devrez lui demander de les diviser dans IIS en tant qu'instances séparées ou vous aurez beaucoup de problèmes.

0 votes

Merci, c'est simple et cela fait l'affaire.

64voto

Developer Points 3081

Dans MVC4 & MVC5 c'est un peu différent, utilisez ce qui suit

/App_Start/RouteConfig.cs

namespace MyNamespace
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

et dans les zones

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "MyNamespace.Areas.Admin.Controllers" }
            );

40voto

Tom Points 2833

Regardez ça... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Puis cette photo (j'espère que tu aimes mes dessins)

enter image description here

0 votes

Le problème est résolu ! :)

1 votes

@ppumkin dites ça à un programmeur aveugle. Le texte peut cependant être lu par des lecteurs d'écran

0 votes

Bonjour Carlos. Oui, je comprends la situation. C'est déjà difficile de l'expliquer aux personnes sans handicap visuel. Je ne suis même pas sûr qu'un quelconque logiciel d'assistance soit capable de décrire correctement ce qui se passe sur l'image. Cela attire l'attention sur le fait que la réponse devrait probablement comporter un texte qui tente au moins de décrire ce qui se passe.

14voto

Ben Foster Points 11699

Une autre solution consiste à enregistrer un espace de noms par défaut avec ControllerBuilder. Comme nous avions beaucoup de routes dans notre application principale et une seule route générique dans nos zones (où nous spécifions déjà un espace de noms), nous avons trouvé que c'était la solution la plus simple :

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");

0 votes

C'était le cas pour moi. Si vous avez vraiment plusieurs contrôleurs avec le même nom, cela peut être nécessaire après avoir ajouté des espaces de noms à vos définitions de route. Par exemple, pour votre page d'accueil où le contrôleur et la zone ne sont pas explicitement choisis par le chemin.

0 votes

Dans le projet sur lequel je travaille, nous avons un backoffice principal clé en main avec des zones pour le travail personnalisé du client. Chacune d'entre elles possède un contrôleur "paramètres". Cette réponse est une excellente alternative pour ne pas avoir à définir une route pour le contrôleur de paramètres de chaque zone.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X