Problemi con più controller con lo stesso nome nel mio progetto


96

Sto riscontrando il seguente errore con il mio progetto ASP.NET MVC 3:

Sono stati trovati più tipi che corrispondono al controller denominato "Home". Ciò può accadere se il percorso che serve questa richiesta ("Home / {action} / {id}") non specifica gli spazi dei nomi per cercare un controller che corrisponde alla richiesta. In questo caso, registra questa route chiamando un overload del metodo "MapRoute" che accetta un parametro "namespaces".

La richiesta di "Home" ha trovato i seguenti controller corrispondenti: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

Ho un HomeController nella mia cartella del controller predefinito, con un nome di classe di MyCompany.MyProject.WebMvc.Controllers.HomeController.

Il mio metodo RegisterRoutes, nel mio global.asax, ha il seguente aspetto:

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

Quindi ho un'area chiamata Company, con un HomeController nella cartella del controller predefinito per l'area, con un nome di classe di MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

Il metodo RegisterArea nel file CompanyAreaRegistration ha il seguente aspetto:

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

Tutto questo porta all'errore che ho evidenziato all'inizio di questo post. Sto lottando cercando di mettere insieme una soluzione da vari altri post, senza FORTUNA .

È possibile avere un HomeController nella cartella dei controller di default e poi uno in OGNI area? In tal caso, devo apportare (supponendo che lo faccia) modifiche al mio file di configurazione per farlo funzionare?

Qualsiasi aiuto sarebbe molto apprezzato!


Fare riferimento a questo stackoverflow.com/a/12633541/2089963 . Per me funziona
Syed Mohamed

Questo è accaduto a me quando ho rinominato il progetto / assembly, ho appena cancellato la cartella bin e ricompilato il progetto e ha funzionato bene.
Core

Risposte:


167

Il messaggio di errore contiene la soluzione consigliata: "In questo caso, registra questa route chiamando un overload del metodo" MapRoute "che accetta un parametro" namespaces "."

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

Questo farà sì che http: // server / vada all'azione Index del tuo HomeController che è, penso, quello che vuoi. http: // server / company / home andrà all'azione Indice HomeController dell'area Company, come definito nella registrazione dell'area.


1
Non l'ho testato, ma il namespacesparametro è un array di stringhe, quindi dovresti essere in grado di passare qualsiasi numero aggiungendo all'array:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka

2
Quel pattern dello spazio dei nomi non ha funzionato per me. MyProject.Controllersha fatto comunque.
The Muffin Man,

Ho provato questo. Ma l'indice in questa MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerclasse è in esecuzione. Ma la vista che appare è quella vecchia.
kbvishnu

Non vale la pena che il quarto parametro qui possa creare un po 'di confusione a causa dell'inferenza del tipo e del significato delle variabili. Il quarto parametro può essere un array di stringhe da vincolare in base allo spazio dei nomi, un oggetto per aggiungere IRouteConstraints OR stringhe che possono essere interpretate come vincoli, oppure puoi avere 5 parametri e includerli entrambi. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris Moschini

Vale anche la pena notare che un percorso troverà la sua strada verso altri spazi dei nomi per impostazione predefinita: se si desidera bloccare un percorso a uno spazio dei nomi o a un insieme di spazi dei nomi, è necessario disabilitare questo fallback: bubblogging.wordpress.com/2012/06/09/mvc- routing-namespaces (fondo pagina)
Chris Moschini

30

Questo è l'approccio asp.net mvc4:

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

2
grazie, questo ha risolto per me, anche se non riesco a capire per la vita di me perché la mia applicazione pensa che ci siano due controller domestici in primo luogo. Ho eseguito una ricerca e sostituzione dello spazio dei nomi, che sembra aver causato il problema, ma una ricerca dell'intera soluzione non mostra alcuna istanza dello spazio dei nomi non autorizzato.
Yann Duran

12
Bene, ho trovato la causa del mio problema. Si spera che questo possa aiutare qualcun altro a cercare disperatamente, come lo ero io oggi. Poiché avevo cambiato il nome dell'applicazione (così come lo spazio dei nomi), nella cartella bin era ancora rimasta una DLL che non veniva eliminata da un file clean. Deve esserci un po 'di magia del MEF sotto le coperte. Non appena ho scoperto ed eliminato la vecchia DLL, il problema è andato via. Non c'è da stupirsi che una ricerca di testo non l'abbia trovato!
Yann Duran

@ YannDuran, si è verificato un problema simile e la tua correzione ha aiutato. Grazie.
Klaus Nji

12

Avevo rinominato gli spazi dei nomi, quindi, ho solo eliminato de cartelle bin e obj e ricostruito , lavoro di nuovo.



2

Usa questo

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

1

Usa solo il nome del progetto:

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

Se stai usando RazorGenerator, la semplice informazione del namespacesparametro potrebbe non essere sufficiente.

Devo risolvere aggiungendo la dichiarazione contrassegnata di seguito in 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
    }

0

Come menzionato da Chris Moschini, il parametro namespaces potrebbe non essere sufficiente se si hanno due aree con lo stesso nome di controller con namespace differenti e la route predefinita none area restituirà un errore di 500 server.

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

È "meglio" sovrascrivere il gestore di route predefinito e aggiungere questa riga:

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

0

Ho riscontrato questo problema dopo aver aggiunto un riferimento a un altro progetto con gli stessi percorsi e il problema è continuato dopo aver rimosso il riferimento.

Risolto eliminando il file .dll di quel riferimento aggiunto dalla cartella bin e ricostruendolo.


0

Come molti altri, ho avuto questo problema dopo aver creato un nuovo progetto di modello MVC dal menu VS2017, durante la creazione del progetto avrei ricevuto il messaggio di errore dell'operazione. Ho quindi usato la risposta https://stackoverflow.com/a/15651619/2417292 pubblicata in precedenza in questo thread da cooloverride per i progetti mvc4. Questo ancora non ha risolto il mio problema, quindi ho rinominato la mia cartella di visualizzazione Home e il file HomeController come cartella di visualizzazione Company / e il file del controller CompanyController. Questo quindi ha funzionato per me, non una soluzione per dire ma una soluzione alternativa se non sei bloccato sull'avere il percorso Home / Index Il mio altro problema era che non riuscivo a trovare il riferimento che causava l'errore e poiché la mia piattaforma di sviluppo era Azure WebApplication rispetto a un VM completa con un file system completo e impostazioni IIS con cui scherzare.


0

Ho avuto lo stesso problema e ho scoperto che la versione precedente aveva creato file compilati nella cartella "bin".

Una volta eliminati questi, l'errore è scomparso.

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.