web-dev-qa-db-fra.com

Le contrôleur pour le chemin n'a pas été trouvé ou n'implémente pas IController

J'ai un projet MVC4 avec sélection de la langue:

  • en
  • nl
  • fr
  • de

1 pièce principale avec:

  • Sur
  • Commun (pour le menu)
  • Contact
  • FAQ
  • Accueil

Et 3 zones:

  • Admin
  • Les clients
  • Boutique

Dans chaque zone, j'ai au moins un contrôleur, par exemple dans Admin, j'ai le contrôleur overview avec le dossier de visualisation correspondant overview qui contient une page index.aspx .

La page d'accueil et toutes les pages principales (environ, faq, etc.) fonctionnent et peuvent être visitées).

Cependant, lorsque je suis l'URL: localhost: xxxx/fr/admin/overview .__, je reçois l'erreur 

Le contrôleur pour le chemin '/ en/admin/overview' est introuvable ou n'implémente pas IController.

Même si l'itinéraire est correct (je peux le voir avec Route Debugger). La page d'erreur indique également que l'erreur a été générée lorsque j'ai voulu charger les éléments de mon menu principal:

<nav id="site-navigation" class="eightcol">
    @Html.Action("MenuItems", "Common")
</nav>

- Code supprimé parce que non pertinent -

Tout semble être en ordre, mais MVC ne semble pas pouvoir charger le menu, situé dans la partie principale.

Ainsi, la racine du problème est la suivante: Puis-je accorder à une zone (par exemple, Admin) un accès aux contrôleurs de la partie principale (maison, commune, environ, etc.) de mon projet?

66
reaper_unique

J'ai trouvé ça.

Lorsqu'une page située dans une zone souhaite accéder à un contrôleur situé en dehors de cette zone (telle qu'une page de présentation partagée ou une page dans une autre zone), la zone de ce contrôleur doit être ajoutée. Le contrôleur commun ne se trouvant pas dans une zone spécifique mais faisant partie du projet principal, vous devez laisser la zone vide:

@Html.Action("MenuItems", "Common", new {area="" }) 

Ce qui précède doit être ajouté à toutes les actions et à tous les liens d’action, étant donné que la page de présentation est partagée dans les divers domaines.

C'est exactement le même problème que ici: ASP.NET MVC Zones avec disposition partagée

Edit: Pour être clair, ceci est marqué comme la réponse parce que c'était la réponse à mon problème. Les réponses ci-dessus pourraient résoudre les causes qui déclenchent la même erreur.

108
reaper_unique

Dans mon cas, la même erreur n'était pas liée à Area mais pensait poster l'erreur provoquée dans mon cas, ce qui peut être utile pour les personnes qui consultent ce fil en recherchant "Le contrôleur du chemin d'accès n'a pas été trouvé ou n'implémente pas IController "

L'erreur est due à une entrée incorrecte dans le fichier _Layout.cshtml. 

@Styles.Render("~/Content/misc")

Le paquet portant ce nom a été supprimé dans BundleConfig.cs mais a oublié de le supprimer dans _Layout.cshtml

C'était idiot, mais nous les programmeurs faisons toujours beaucoup d'erreurs idiotes :)

14
Tejasvi Hegde

De plus, pour ceux qui n'ont pas trouvé la solution ci-dessus, voici ce qui a fonctionné pour moi:

J'ai une solution avec plusieurs projets. Tous les projets étaient dans MVC3. J'ai installé Visual Studio 2012 sur ma machine et il semble que certains projets aient été automatiquement mis à niveau vers MVC4. 

J'ai ce problème 

Le contrôleur pour le chemin '/ etc/etc' est introuvable ou n'implémente pas IController.

parce que le projet qui gérait cet itinéraire pointait sur MVC4. 

J'ai dû mettre à jour manuellement leurs références pour utiliser MVC3. Vous pouvez également le faire en ouvrant le fichier .csproj avec un éditeur de texte. Recherchez la référence à MVC3 et supprimez cette ligne: 

<SpecificVersion>False</SpecificVersion>
14

Cette erreur peut également être due au fait que les contrôleurs doivent avoir (en leur nom) le mot Controller; à savoir: HomeController; sauf si vous implémentez votre propre ControllerFactory.

12
George Stocker

dans mon cas, le problème était que la classe de contrôleur n'a pas été annoncée publiquement.

class WorkPlaceController : Controller

la solution était

public class WorkPlaceController : Controller
11
SoaperPlus

Une autre cause possible de cette erreur réside dans le fait que l’espace de nom de la classe d’enregistrement de zone ne correspond pas à celui du contrôleur.

Par exemple. nommer correctement sur la classe du contrôleur:

namespace MySystem.Areas.Customers
{
    public class CustomersController : Controller
    {
        ...
    }
}

Avec un nom incorrect sur la classe d'enregistrement de zone:

namespace MySystem.Areas.Shop
{
    public class CustomersAreaRegistration : AreaRegistration
    {
        ...
    }
}

(L'espace de noms ci-dessus devrait être MySystem.Areas.Customers.)

Est-ce que j'apprendrai un jour à arrêter de copier-coller du code? Probablement pas.

9
Carl

Voici mon problème et la solution que ce qui a fonctionné pour moi.

J'ai ajouté un nouveau contrôleur avec une seule action renvoyant une chaîne à une application existante. Mais lorsque j'ai accédé à ce contrôleur via un navigateur, j'ai eu la même erreur que celle mentionnée ci-dessus. 

Après avoir fait beaucoup de recherches sur Google, j'ai découvert que je devais simplement modifier mon fichier Global.asax.cs pour qu'il reconnaisse le nouveau contrôleur. Tout ce que j'ai fait a été ajouté un espace au fichier Global.asax.cs afin qu'il soit modifié et que cela fonctionne

6
armulator

Dans mon cas, le paramètre namespaces ne correspondait pas à l'espace de noms du contrôleur. 

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new {controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "Web.Areas.Admin.Controllers" }
    );
}
6

Dans mon cas, j'avais @{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); } dans _Layout.cshtml mais le LayoutController n'existait pas! (J'avais copié _Layout.cshtml à partir d'une autre solution mais j'avais oublié de copier le contrôleur)

5
Rush Frisby

Je ne sais pas si cela pose un problème sous un angle différent de celui de la réponse acceptée, mais j’ai constaté que l’un de mes contrôleurs de la section Areas était assis dans le mauvais espace de noms. Corriger l'espace de noms pour:

Areas.{AreaName}.Controller

résolu le problème pour moi.

Je soupçonne que le facteur clé était que tous les contrôleurs d’une zone donnée partagent le même espace de noms.

5
Richard Freeman

Une autre cause de cette erreur: Utilisation accidentelle de Html.Action dans un fichier de mise en page où Html.ActionLink aurait pu être voulu. Si la vue référencée par Html.Action utilise le même fichier de mise en page, vous avez effectivement créé une boucle sans fin. (La vue de mise en page charge la vue référencée en tant que vue partielle qui charge ensuite la vue de mise en page qui charge la vue référencée ...) Si vous définissez un point d'arrêt dans le fichier de mise en page et que vous parcourez l'étape Htlm.Action de manière plus utile message sur la taille de pile excessive. 

4

Embarrassant, le problème dans mon cas est que je n’ai pas reconstruit le code après l’ajout du contrôleur .

Alors peut-être que la première chose à vérifier est que votre contrôleur a été construit et est présent (et public) dans les fichiers binaires. Cela pourrait vous éviter quelques minutes de débogage si vous êtes comme moi.

2
Tom Pažourek

Si cela convient à votre conception, vous pouvez vous assurer que le modificateur d'accès de votre classe de contrôleur est "public" et non quelque chose qui pourrait limiter l'accès comme "interne" ou "privé".

1
Chris Halcrow

Dans un autre scénario, j'aimerais simplement ajouter ceci: Dans mon scénario, l'espace de nom était différent pour le contrôleur car il s'agissait d'une erreur de copie du contrôleur d'un autre projet.

1
LifeOfPi

Ce problème se produit également si vous n'incluez pas votre classe de contrôleur pour le processus de compilation dans les fichiers .csproj.

<Compile Include="YOUR_CONTROLLER_PATH.cs" />
1
Ismail Yilmaz

Dans mon cas d'application héritée, le problème s'est produit lorsque j'ai ajouté l'entrée ci-dessous dans le fichier web.config sous le noeud <system.webServer>

       <modules runAllManagedModulesForAllRequests="true"></modules>

Quand je l'ai enlevé, le problème a été résolu. 

1
Prashant Deherkar

Dans mon cas, c'était parce que le contrôleur était nom incorrect. J'ai appelé LayoutController, mais j'aurais dû appeler Layout à la place:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "LayoutController" })</a>

devrait être:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "Layout")</a>
1
live-love

Dans mon cas, dans la méthode global.asax/application_start, .__, j'enregistrais les routes api Web APRÈS les routes mvc comme suit:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

L'annulation de l'ordre a résolu le problème

GlobalConfiguration.Configure(WebApiConfig.Register);            
RouteConfig.RegisterRoutes(RouteTable.Routes);
0
Ege Tuncoz

En me basant sur cette answer de George, j’ai trouvé dans mon cas que j’avais configuré mon contrôleur correctement en tant que ThingController et que ma méthode Edit était correctement définie.

Mais .. je me référais à mon avis avec

<a href="/App/ThingController/Edit" />

Où j'aurais dû simplement utiliser le nom sans le contrôleur Word, comme

<a href="/App/Thing/Edit" />

0
Xynos