2012-12-23 9 views
59

Ho un progetto di MVC4 con selezione della lingua:Il controller per il percorso non è stato trovato o non implementare IController

  • en
  • nl
  • fr
  • de

1 parte principale con:

  • Chi
  • comune (per il menu)
  • Contatto
  • Faq
  • casa

e 3 aree:

  • Admin
  • Clienti
  • negozio

In ogni zona ho almeno un controller, per esempio in Admin aver il controllore panoramica con cartella corrispondente vista panoramica che contiene una pagina index.aspx.

La pagina iniziale e tutte le pagine principali (circa, faq, ecc.) Funzionano e possono essere visitate).

Tuttavia, quando seguo l'url: localhost: xxxx/it/admin/panoramica ottengo l'errore

The controller for path '/en/admin/overview' was not found or does not implement IController.

Anche se, il percorso è corretto (posso vedere questo con itinerario Debugger). La pagina di errore mostra anche che l'errore è stato gettato, quando ho voluto caricare i miei principali voci di menu:

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

- Codice rimosso perché irrilevanti -

Tutto sembra essere in ordine, ma MVC non sembra in grado di caricare il menu, che si trova nella parte principale.

Quindi, la radice del problema è: Posso concedere ad un'area (ad esempio Admin) l'accesso ai controller nella parte principale (casa, comune, ecc.) Del mio progetto?

+0

Hai provato a commentare la chiamata a Html.Azione per isolare il problema sul controller specifico? –

+0

Non l'avevo ancora, ma ora l'ho fatto ed è come pensavo. L'area ** Admin ** utilizza il layout dalla parte principale del mio progetto e quando raggiunge l'azione l'area tenta di accedere al controller che non si trova nell'area che genera l'errore. In altre parole, la radice del problema è, come posso concedere un'area di accesso ai controller nella parte principale (controller di casa, comune, ecc.) Del mio progetto? –

+2

La domanda sta ottenendo più possibili problemi e soluzioni. Quindi è d'obbligo, credo, guardare anche ad altre risposte e non l'unica accettata. – Alireza

risposta

102

L'ho trovato.

Quando una pagina, che si trova all'interno di un'area, desidera accedere a un controller che si trova al di fuori di quest'area (ad esempio una pagina di layout condivisa o una determinata pagina all'interno di un'area diversa), l'area di questo controller necessita essere aggiunto. Dal momento che il controller comune non è di una determinata area, ma parte del progetto principale, si deve lasciare un'area vuota:

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

Le esigenze di cui sopra che si aggiungono a tutte le azioni e le actionlinks dal momento che la pagina di layout è condiviso in tutte le varie aree.

E 'esattamente lo stesso problema qui: ASP.NET MVC Areas with shared layout

Modifica: Per essere chiari, questo è contrassegnato come la risposta, perché era la risposta per il mio problema. Le risposte sopra potrebbero risolvere le cause che innescano lo stesso errore.

+9

Grazie, ha funzionato per me. È un messaggio di errore molto fuorviante di .NET che dice che non è possibile trovare il controller per l'azione all'interno dell'area, il che non è affatto il caso! –

12

Inoltre, per coloro che la soluzione di cui sopra non ha funzionato, ecco è ciò che ha funzionato per me:

ho una soluzione con più progetti. Tutti i progetti erano in MVC3. Ho installato Visual Studio 2012 nella mia macchina e sembra che alcuni progetti siano stati automaticamente aggiornati a MVC4.

ho avuto questo problema

The controller for path '/etc/etc' was not found or does not implement IController

perché il progetto che ha gestito quella strada stava indicando MVC4.

Ho dovuto aggiornare manualmente i loro riferimenti per utilizzare MVC3. Puoi farlo anche aprendo il file .csproj con un editor di testo. Trova il riferimento a MVC3 e rimuovi questa riga:

<SpecificVersion>False</SpecificVersion> 
+2

Oh mio Dio. È così casuale e oscuro. Grazie mille per la pubblicazione! :) LETTORI FUTURI: Il mio era solo leggermente diverso - la versione dll stessa era 4.0 invece di 3.0 - non so come sia cambiata. –

+0

Il problema con il mio era simile; Avevo una libreria condivisa a cui faceva riferimento il livello di presentazione e conteneva un controller condiviso e la libreria condivisa utilizzava mvc4, mentre il livello di presentazione utilizzava mvc3. Una volta aggiornata la libreria condivisa su MVC3, è stato risolto il problema. – joey

6

Ecco il mio problema e la soluzione che ciò che ha funzionato per me.

Ho aggiunto un nuovo controller con una singola azione restituendo una stringa a un'applicazione esistente. Ma quando ho navigato su quel controller tramite browser, ricevevo lo stesso errore di cui sopra.

Dopo aver fatto molte ricerche su google, ho scoperto che dovevo semplicemente modificare il mio file Global.asax.cs affinché riconoscesse il nuovo controller. Tutto ciò che ho fatto è stato aggiungere uno spazio al file Global.asax.cs in modo che sia modificato e funzionasse

+0

Disponiamo di 3 server Web di produzione e 5 macchine di sviluppo/test. Solo su una macchina di produzione non funzionava. L'aggiunta di uno spazio e il salvataggio di Global.asax l'hanno risolto. #mindblown – jbwebtech

13

Nel mio caso, lo stesso errore non era correlato ad Area ma pensavo di pubblicare l'errore causato nel mio caso, che potrebbe essere utile per le persone che vengono a questo thread cercando "Il controller per il percorso non è stato trovato o non implementa IController"

L'errore è stato causato a causa di una voce errata nel file _Layout.cshtml.

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

Il bundle con quel nome è stato rimosso in BundleConfig.cs ma ha dimenticato di rimuovere in _Layout.cshtml

E 'stato stupido, ma noi i programmatori fanno sempre molti errori stupidi :)

+1

Grazie per la soluzione. È infatti possibile che esistano più soluzioni a un problema apparentemente identico, ma solo un problema simile. Tuttavia, poiché la mia domanda ha dichiarato che utilizzo le aree, la mia soluzione selezionata è ancora la più accurata. –

10

Questo errore può anche essere causato dal fatto che i Controllori devono avere (nel loro nome) la parola Controller; vale a dire: HomeController; a meno che non si implementi il ​​proprio ControllerFactory.

+2

Questo è stato un mio errore. Grazie Giorgio! – Wilky

+0

Ho avuto questo problema. È perché ho cancellato il mio file HomeController.cs e non ho capito cosa dipendesse da questo. – user2023861

5

Non sono sicuro se questo riscontri la soluzione da una diversa angolazione rispetto alla risposta accettata, ma ho trovato che uno dei miei controller nella sezione Aree era nello spazio dei nomi sbagliato.Correzione dello spazio dei nomi su:

Areas.{AreaName}.Controller 

risolto il problema per me.

Sospetto che il fattore chiave fosse che tutti i controller di una determinata area condividessero lo stesso spazio dei nomi.

+0

Vorrei che tu potessi le risposte preferite e non solo le domande. Sono incappato in questa risposta così tante volte. È stato molto utile, grazie. – Shelby115

9

nel mio caso, il problema era che la classe controller non è stata annunciata pubblicamente.

class WorkPlaceController : Controller 

La soluzione è stata

public class WorkPlaceController : Controller 
7

Un'altra possibile causa principale di questo errore è se lo spazio dei nomi per la classe di registrazione zona non corrisponde lo spazio dei nomi per il controller.

E.g. corretta denominazione in classe controller:

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

Con la denominazione non corretto di zona di classe di registrazione: (. Spazio dei nomi di cui sopra dovrebbe essere MySystem.Areas.Customers)

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

imparerò mai a smettere di copiare ed incollare il codice ? Probabilmente no.

4

Un'altra causa di questo errore: uso accidentale di Html.Azione in un file di layout in cui potrebbe essere stato progettato Html.ActionLink. Se la vista referenziata da Html.Action utilizza lo stesso file di layout, hai effettivamente creato un ciclo infinito. (La vista di layout carica la vista di riferimento come vista parziale che quindi carica la vista di layout che carica la vista di riferimento ...) Se si imposta un punto di interruzione nel file di layout e un singolo passaggio attraverso Htlm.Action a volte si otterrà un aiuto più utile messaggio sull'eccessiva dimensione dello stack.

5

Nel mio caso avevo @{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); } in _Layout.cshtml ma il LayoutController non esisteva! (Avevo copiato _Layout.cshtml da un'altra soluzione ma ho dimenticato di copiare il controller)

1

In un altro scenario vorrei solo aggiungere è Nel mio scenario, lo spazio dei nomi era diverso per il controller poiché era un errore copiare il controller da un altro progetto.

4

Nel mio caso il parametro namespaces non corrispondeva allo spazio dei nomi del controller.

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

Se appropriato per il vostro disegno, è possibile assicurarsi che il modificatore di accesso sulla vostra classe controller è 'pubblico', non qualcosa che potrebbe limitare l'accesso come 'interna' o 'privato'.

1

In modo imbarazzante, il problema nel mio caso è che non ho ricreato il codice dopo aver aggiunto il controller.

Quindi forse la prima cosa da verificare è che il controller è stato creato ed è presente (e pubblico) nei binari. Potrebbe farti risparmiare qualche minuto di debug se sei come me.

1

Nel mio caso di applicazione legacy, il problema si è verificato quando ho aggiunto sotto voce nel web.file di configurazione nel nodo <system.webServer>

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

Quando ho rimosso, il problema risolto.

Problemi correlati