Sono stati trovati più tipi che corrispondono al controller denominato "Home"


318

Attualmente ho due progetti MVC3 non correlati ospitati online.

Uno funziona bene, l'altro non funziona, dandomi l'errore:

Sono stati trovati più tipi che corrispondono al controller denominato "Home". Ciò può accadere se la route che soddisfa questa richiesta ('{controller} / {action} / {id}') non specifica gli spazi dei nomi per cercare un controller che corrisponda alla richiesta.

In tal caso, registrare questa route chiamando un sovraccarico del metodo "MapRoute" che accetta un parametro "namespace".

Il modo in cui funziona il mio hoster è che mi dà l'accesso FTP e in quella cartella ho altre due cartelle, una per ciascuna delle mie applicazioni.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com funziona bene, pubblico la mia applicazione sul mio file system locale, quindi FTP il contenuto e funziona.

Quando eseguo il caricamento e provo a eseguire bar.com, il problema sopra riportato si attiva e mi impedisce di utilizzare il mio sito. Tutto mentre foo.com funziona ancora .

Bar.com sta cercando dai controller OVUNQUE all'interno di ftpFolderA2 ed è per questo che ne sta trovando un altro HomeController? Come posso dire di guardare solo nella cartella Controller come dovrebbe?

I fatti:

  1. Non usare le aree. Questi sono due progetti COMPLETAMENTE non correlati. Metto ogni progetto pubblicato in ogni rispettiva cartella. Nulla di bello.
  2. Ogni progetto ha solo 1 HomeController.

Qualcuno può confermare che questo è il problema?


Domanda molto chiara. Stai usando le aree? Il problema si verifica localmente?
Darin Dimitrov,

1
@Darin: ho modificato le informazioni in.
Solo boliviano qui,

Risposte:


473

Questo messaggio di errore si verifica spesso quando si utilizzano le aree e si ha lo stesso nome del controller all'interno dell'area e della radice. Ad esempio hai i due:

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

Per risolvere questo problema (come suggerisce il messaggio di errore), è possibile utilizzare gli spazi dei nomi durante la dichiarazione dei percorsi. Quindi nella definizione del percorso principale in Global.asax:

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

e nel tuo ~/Areas/Admin/AdminAreaRegistration.cs:

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

Se non si utilizzano aree, sembra che entrambe le applicazioni siano ospitate all'interno della stessa applicazione ASP.NET e si verificano conflitti perché si hanno gli stessi controller definiti in spazi dei nomi diversi. Dovrai configurare IIS per ospitare quei due come applicazioni ASP.NET separate se vuoi evitare questo tipo di conflitti. Chiedi al tuo provider di hosting se non hai accesso al server.


Non sto usando affatto le aree. Queste sono due applicazioni completamente non correlate che risiedono in una cartella separata all'interno di una cartella radice FTP. Forse la mia applicazione è alla ricerca di controller MVC ovunque e che raggiungano lo stesso caso si estenda all'altro controller di casa. Come posso dire che non guarda da nessuna parte ma è la propria cartella Controller e ignora il resto?
Solo boliviano qui,

2
@SergioTapia, sembra che siano abbastanza correlate alle tue applicazioni. Il tuo provider di hosting li ha inseriti nella stessa applicazione ASP.NET. Dovrai chiedergli di dividerli in IIS come istanze separate o avrai molti problemi.
Darin Dimitrov,

13
Grazie. In ASP MVC 4.0 è necessario passare l'argomento denominato come namespace: new [] {"AppName.Areas.Admin.Controllers"}
om471987

1
+1 - Funziona bene. Non mi ero reso conto che esistesse un'area separata per la registrazione del percorso nelle aree. Ovunque guardi sembra che ci sia una risposta di qualità da Darin :)
Travis J

1
Se si utilizzano aree e si desidera lo spazio dei nomi dei controller, è necessario lo spazio dei nomi sia dei percorsi all'interno che all'esterno. Solo il namespace del percorso dell'area mi ha ancora dato questo problema.
Gavin Ward,

528

Ecco un altro scenario in cui potresti riscontrare questo errore. Se si rinomina il progetto in modo che il nome del file dell'assembly cambi, è possibile disporre di due versioni dell'assembly ASP.NET, che riprodurrà questo errore.

La soluzione è andare nella tua bincartella ed eliminare le vecchie dll. (Ho provato "Ricostruisci progetto", ma questo non li ha eliminati, quindi assicurati di controllare binper assicurarti che non ci siano più)


1
Altra variante di questo errore è quando si utilizza il resharper e si utilizzano alcune opzioni di refactor "auto" che includono la modifica del nome dello spazio dei nomi. Questo è quello che mi è successo.
Sebastian 506563,

5
Se lo ricevi da un servizio app di Azure, vai su https: // <your_app_name_here> .scm.azurewebsite.net / DebugConsole per accedere ed eliminare i file.
Tom Blodget,

5
Grazie a me questo è stato il problema. Avevo creato un "nuovo" progetto copiando / incollando un progetto esistente in una nuova cartella; la vecchia build build è arrivata, eliminando la cartella bin cancellata e pulita
brando

Ho ottenuto questo quando ho spostato i miei file di progetto su una seconda unità. La cancellazione della cartella bin lo risolve. La cosa più strana.
Roberto Bonini,

Bene, è stato un errore dolorosamente fastidioso con una soluzione molto semplice. Grazie!
Troy Grosfield,

63

In MVC4 e MVC5 È un po 'diverso, usare quanto segue

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

e nelle aree

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

39

Guarda questo ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Quindi questa foto (spero che ti piacciano i miei disegni)

inserisci qui la descrizione dell'immagine


Risolto il problema ..! :)
Aruna,

1
@ppumkin dillo a un programmatore cieco. Il testo può essere letto dagli screen reader
Carlos Muñoz,

Ciao Carlos Sì, capisco la situazione. È già difficile spiegarlo a persone senza disabilità visive. Non sono nemmeno sicuro che qualsiasi tipo di software di assistenza sia in grado di descrivere bene ciò che sta accadendo nella foto a qualsiasi organismo. Porta all'attenzione che la risposta dovrebbe probabilmente avere un testo almeno cercando di descrivere cosa sta succedendo.
Piotr Kula,

32

Ciò che altri hanno detto è corretto, ma per coloro che devono ancora affrontare lo stesso problema:
nel mio caso è successo perché ho copiato un altro progetto e l'ho rinominato in qualcos'altro MA i precedenti file di output nella bincartella erano ancora lì ... E sfortunatamente, colpendo Build -> Clean Solutiondopo aver rinominato il progetto e Namespaces non li rimuove ... quindi eliminarli manualmente risolto il mio problema!


2
il tuo suggerimento mi ha salvato
Abhimanyu,

1
anche a me, grazie, clean dosnt in realtà significa clean, grrrr
katibaer

1
Grazie @DrTJ Questo è stato davvero frustrante! Ci si aspetta che il processo pulito e pericoloso funzioni e le aspettative sono la radice del fallimento. Questo mi ha risparmiato di strapparmi ulteriormente i capelli!
Mike

28

nella bin/cartella del progetto

assicurati di avere solo il tuo PROJECT_PACKAGENAME.DLL

e rimuovi ANOTHER_PROJECT_PACKAGENAME.DLL

che potrebbe apparire qui per errore o semplicemente rinominare il progetto


2
Esattamente il mio problema. Grazie.
Detilium,

Ha funzionato per me! thnks!
Eyal

Avevo cambiato il nome dell'assemblaggio e avevo alcune vecchie DLL sedute nel cestino. Grazie
aprile

Grazie! Non riesco a credere di aver perso qualcosa di così semplice.
Vash

25

Controllare la cartella bin se è presente un altro file dll che potrebbe essere in conflitto con la classe homeController.


7
Questo mi ha morso durante la copia di un progetto e la sua ridenominazione ... il vecchio progetto chiamato dll era ancora nel cestino, una pulizia non lo ha rimosso ... Ho dovuto eliminarlo manualmente!
Paul Zahra,

2
Questo è stato il problema per me. Un collega ha aggiunto per errore un riferimento da un progetto front-end a un altro creando questo problema. Ha rimosso il riferimento, quindi Visual Studio ha rimosso anche i file dll sul suo disco. Ho estratto l'aggiornamento da Git, i riferimenti erano spariti, ma i file DLL erano rimasti, anche dopo un clean. Semplicemente perché il mio VS non ha più visto il riferimento. Ma durante l'esecuzione di IIS ho visto i file e li hanno usati. Rimuoverli dal mio disco ha aiutato.
Yeronimo,

14

Un'altra soluzione è quella di registrare uno spazio dei nomi predefinito con ControllerBuilder. Dato che avevamo molti percorsi nella nostra applicazione principale e un solo percorso generico nelle nostre aree (dove stavamo già specificando uno spazio dei nomi), abbiamo trovato che questa era la soluzione più semplice:

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

Questo è stato il caso per me. Se hai veramente più controller con lo stesso nome, questo potrebbe essere necessario dopo aver aggiunto spazi dei nomi alle definizioni del tuo percorso. Ad esempio, per la tua home page in cui il controller e l'area non sono esplicitamente scelti dal percorso.
Jason Beck,

Nel progetto su cui lavoro, abbiamo un backoffice chiavi in ​​mano con aree per il lavoro personalizzato del cliente. Ognuno ha un controller 'impostazioni'. Questa risposta è un'ottima alternativa alla necessità di definire un percorso per il controller delle impostazioni per ciascuna area.
Derreck Dean,

7

Anche se non stai utilizzando le aree, puoi comunque specificare nella RouteMap quale spazio dei nomi utilizzare

routes.MapRoute(
    "Default",
    "{controller}/{action}",
    new { controller = "Home", action = "Index" },
    new[] { "NameSpace.OfYour.Controllers" }
);

Ma sembra che il vero problema sia il modo in cui le tue due app sono configurate in IIS


7

Ho appena avuto questo problema, ma solo quando ho pubblicato sul mio sito Web, sul mio debug locale è andato tutto bene. Ho scoperto che dovevo usare l'FTP dal mio webhost e andare nella mia directory di pubblicazione ed eliminare i file nella cartella BIN, eliminarli localmente non ha fatto nulla quando ho pubblicato.


Questa è stata la soluzione per me. Il mio profilo di pubblicazione non ha rimosso i file non presenti localmente, quindi la mia app ha raccolto vecchie dll oltre a quelle nuove e ha trovato tipi duplicati.
Modulo

1
Ho cambiato il nome del mio progetto e ho aggiornato tutti i file, ma ho riscontrato questo errore. L'eliminazione della cartella bin ha funzionato anche per me.
Mauro Valvano,

6

Potrebbe esserci un altro caso con Aree anche se hai seguito tutti i passaggi nel routing in Aree (come dare spazi dei nomi nella tabella di routing globale), che è:

È possibile che i controller globali non siano stati inseriti nello "spazio dei nomi" fornito nel routing.

Per esempio:

Fatto questo:

public class HomeController : Controller
{

Invece di:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

Sì Non è sufficiente fornire uno spazio dei nomi in MapRoute. Lo spazio dei nomi fornito qui deve corrispondere allo spazio dei nomi della classe controller in cui risiede. Ora funziona!
DanKodi,

6

Puoi anche ottenere l'errore 500 se aggiungi il tuo assembly che contiene ApiController sovrascrivendo GetAssemblies di DefaultAssembliesResolver ed è già nell'array da base.GetAssemblies ()

Caso in questione:

public class MyAssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<Assembly> GetAssemblies()
    {
        var baseAssemblies = base.GetAssemblies();

        var assemblies = new List<Assembly>(baseAssemblies);

        assemblies.Add(Assembly.GetAssembly(typeof(MyAssembliesResolver)));

        return new List<Assembly>(assemblies);
    }
}

se il codice sopra si trova nello stesso assembly del controller, quell'assembly sarà nell'elenco due volte e genererà un errore 500 poiché l'API Web non sa quale utilizzare.


6

se si desidera risolverlo automaticamente .. è possibile utilizzare l'assambly dell'applicazione semplicemente aggiungere il seguente codice:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { string.Format("{0}.Controllers", BuildManager.GetGlobalAsaxType().BaseType.Assembly.GetName().Name) }
        );

1
ottima soluzione se hai gli stessi controller in più progetti
Ravi Anand,

4

Ho avuto gli stessi problemi e niente ha aiutato. Il problema è che in realtà non ho duplicati, questo errore appare dopo aver cambiato lo spazio dei nomi del progetto da MyCuteProjectaMyCuteProject.Web .

Alla fine ho capito che la fonte dell'errore è un global.asaxfile - markup XML, non .cs-codebehind. Controlla lo spazio dei nomi in esso - questo mi ha aiutato.


2

ho appena cancellato la cartella 'Bin' dal server e copiato il mio cestino sul server, e il mio problema è stato risolto.


2

In Route.config

namespace: new [] {"Appname.Controllers"}


1

Abbiamo scoperto che abbiamo riscontrato questo errore quando si è verificato un conflitto nella nostra build che è apparso come un avvertimento.

Non abbiamo ottenuto i dettagli fino a quando non abbiamo aumentato Visual Studio -> Strumenti -> Opzioni -> Progetti e soluzioni -> Crea ed esegui -> Progetto MSBuild sviluppa l'output dettagliato su Dettagliato.

Il nostro progetto è un'applicazione web .net v4 e si è verificato un conflitto tra System.Net.Http (v2.0.0.0) e System.Net.Http (v4.0.0.0). Il nostro progetto ha fatto riferimento alla versione v2 del file da un pacchetto (incluso usando nuget). Quando abbiamo rimosso il riferimento e aggiunto un riferimento alla versione v4, la build ha funzionato (senza avvisi) e l'errore è stato corretto.


1

Altra variante di questo errore è quando si utilizza il resharper e si utilizzano alcune opzioni di refactor "auto" che includono la modifica del nome dello spazio dei nomi. Questo è quello che mi succede. Per risolvere il problema con questo tipo di cartella di eliminazione dello scenariobin


Questo è successo a me quando ho copiato i contenuti di 1 progetto sui contenuti di un altro. Ho dovuto eliminare i file specifici dalla cartella bin
Adriaan Davel,

1

Fare clic con il tasto destro del mouse sul progetto e selezionare clean the project. Oppure svuota completamente la directory bin e poi ricostruisci di nuovo. Ciò dovrebbe eliminare eventuali assiemi rimasti dalle build precedenti


1

Qualche volta in una singola applicazione questo problema arriva anche In tal caso selezionare queste caselle di controllo quando si pubblica l'applicazione inserisci qui la descrizione dell'immagine


1

Se potesse aiutare gli altri, ho anche affrontato questo errore. Il problema era causato da un riferimento errato nel mio sito web. Per motivi sconosciuti il ​​mio sito web si riferiva a un altro sito Web, nella stessa soluzione. E una volta rimosso quel cattivo riferimento, la cosa ha iniziato a funzionare correttamente.


0

Se lavori in Episerver o in un altro CMS basato su MVC, potresti scoprire che quel particolare nome del controller è già stato rivendicato.

Questo mi è successo quando ho tentato di creare un controller chiamato FileUpload.


0

stavo affrontando il problema simile. e la ragione principale era che avevo lo stesso controller in due diverse aree. una volta rimosso quello che funziona benissimo.

ce l'ho utile per te.

Soluzione di progetto


0

Ho due progetti in una soluzione con lo stesso nome controller. Ho rimosso il secondo riferimento al progetto nel primo progetto e il problema è stato risolto


0

Ho riscontrato che questo errore può verificarsi con il sito Web ASP.NET tradizionale quando si crea il controller nella directory non App_Code (a volte Visual Studio lo impedisce).

Imposta il tipo di file su "Compila" mentre qualsiasi codice aggiunto a "Codice_app" è impostato su "Contenuto". Se copi o sposti il ​​file in App_Code, è comunque impostato come "Compila".

Ho il sospetto che abbia qualcosa a che fare con il funzionamento del progetto del sito Web poiché i progetti del sito Web non hanno alcuna operazione di compilazione. Annullare la cartella bin e passare a "Contenuto" sembra risolverlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.