Mam problem z wieloma kontrolerami o tej samej nazwie w moim projekcie


96

Uruchamiam następujący błąd w moim projekcie ASP.NET MVC 3:

Znaleziono wiele typów pasujących do kontrolera o nazwie „Home”. Może się tak zdarzyć, jeśli trasa obsługująca to żądanie („Home / {action} / {id}”) nie określa przestrzeni nazw do wyszukiwania kontrolera, który pasuje do żądania. W takim przypadku zarejestruj tę trasę, wywołując przeciążenie metody „MapRoute”, która przyjmuje parametr „namespaces”.

Żądanie „Strona główna” znalazło następujące pasujące kontrolery: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

Mam HomeController w moim domyślnym folderze kontrolera z nazwą klasy MyCompany.MyProject.WebMvc.Controllers.HomeController.

Moja metoda RegisterRoutes w moim global.asax wygląda następująco:

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

Mam wtedy obszar o nazwie Firma z HomeController w domyślnym folderze kontrolera dla tego obszaru, z nazwą klasy MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

Metoda RegisterArea w pliku CompanyAreaRegistration wygląda następująco:

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

To wszystko prowadzi do błędu, który podkreśliłem na początku tego postu. Próbuję złożyć rozwiązanie z różnych innych postów, ale BEZ SZCZĘŚCIA .

Czy można mieć HomeController w domyślnym folderze kontrolerów, a następnie jeden w KAŻDYM obszarze? Jeśli tak, czy muszę wprowadzić (zakładając, że to zrobię) zmiany w moim pliku konfiguracyjnym, aby to zadziałało?

Każda pomoc byłaby bardzo mile widziana!


Zapoznaj się z tym stackoverflow.com/a/12633541/2089963 . To działa dla mnie
— Syed Mohamed

Dzieje się tak, gdy zmieniłem nazwę projektu / zespołu, po prostu usunąłem folder bin i ponownie skompilowałem projekt i działało dobrze.
— Core

Odpowiedzi:


167

Komunikat o błędzie zawiera zalecane rozwiązanie: „W takim przypadku zarejestruj tę trasę, wywołując przeciążenie metody„ MapRoute ”, która przyjmuje parametr„ przestrzenie nazw ”.”

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

Spowoduje to, że http: // server / przejdzie do akcji indeksu HomeControllera, która jest, jak sądzę, tym, czego chcesz. Adres http: // server / company / home przejdzie do akcji Indeks kontrolera HomeControllera obszaru firmy, zgodnie z definicją w rejestracji obszaru.


1
Nie testowałem tego, ale namespacesparametr jest tablicą łańcuchową, więc powinieneś być w stanie przekazać dowolną liczbę, dodając do tablicy:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
— David Ruttka

2
Ten wzorzec przestrzeni nazw nie działał dla mnie. MyProject.Controllersjednak.
— The Muffin Man,

Próbowałem tego. Ale indeks w tej MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerklasie jest wykonywany. Ale wydaje się, że widok jest stary.
— kbvishnu

Nic nie warte, że czwarty parametr może być nieco mylący z powodu wnioskowania o typie i znaczenia zmiennej. Czwartym parametrem może być tablica ciągów do ograniczenia przestrzeni nazw, obiekt do dodawania IRouteConstraints LUB ciągi znaków, które mogą być interpretowane jako ograniczenia lub możesz mieć 5 parametrów i zawierać oba. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
— Chris Moschini

Warto również zauważyć, że ścieżka domyślnie znajdzie drogę do innych przestrzeni nazw - jeśli chcesz zablokować ścieżkę do przestrzeni nazw lub zestawu przestrzeni nazw, musisz wyłączyć tę rezerwę : bubblogging.wordpress.com/2012/06/09/mvc- routing-namespaces (dół strony)
— Chris Moschini,

30

To jest podejście 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
dzięki, rozwiązałem to dla mnie, chociaż nie mogę zrozumieć do końca życia, dlaczego moja aplikacja myśli, że są dwa domowe kontrolery. Wyszukałem i zamieniłem przestrzeń nazw, co wydaje się powodować problem, ale przeszukanie całego rozwiązania nie pokazuje żadnych instancji fałszywej przestrzeni nazw.
— Yann Duran

12
Cóż, znalazłem przyczynę mojego problemu. Mam nadzieję, że może to pomóc komuś innemu w desperackich poszukiwaniach, tak jak ja dzisiaj. Ponieważ zmieniłem nazwę aplikacji (a także przestrzeń nazw), w folderze bin nadal pozostawała biblioteka DLL, która nie została usunięta przez wyczyszczenie. Pod kołdrą musi działać jakaś magia MEF. Gdy tylko odkryłem i usunąłem starą bibliotekę DLL, problem zniknął. Nic dziwnego, że wyszukiwanie tekstowe go nie znalazło!
— Yann Duran

@YannDuran, napotkałem podobny problem, a Twoja naprawiona pomogła. Dzięki.
— Klaus Nji,

12

Miałem przemianowany przestrzeni nazw, tak, ja tylko usuwać de foldery bin i obj i odbudować , prace ponownie.



2

Użyj tego

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

1

Użyj tylko nazwy projektu:

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

Jeśli używasz RazorGenerator, samo podanie namespacesparametru może nie wystarczyć.

Muszę rozwiązać dodając oświadczenie zaznaczone poniżej 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

Jak wspomniał Chris Moschini, parametr namespaces może nie wystarczyć, jeśli masz dwa obszary o tej samej nazwie kontrolera z różnymi przestrzeniami nazw, a domyślna trasa none area zwróci błąd serwera 500.

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

Najlepiej jest zastąpić domyślną procedurę obsługi trasy i dodać tę linię:

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

0

Miałem ten problem po dodaniu odwołania do innego projektu, który miał te same trasy, a problem nadal występował po usunięciu odniesienia.

Rozwiązanie rozwiązane przez usunięcie pliku .dll tego dodanego odniesienia z folderu bin i ponowne kompilowanie.


0

Podobnie jak wielu innych, miałem ten problem po utworzeniu nowego projektu szablonu MVC z menu VS2017, podczas budowania projektu otrzymywałem komunikat o błędzie op. Następnie skorzystałem z odpowiedzi https://stackoverflow.com/a/15651619/2417292 opublikowanej wcześniej w tym wątku przez cooloverride dla projektów mvc4. To nadal nie rozwiązało mojego problemu, więc zmieniłem nazwę mojego folderu widoku głównego i pliku HomeController na folder widoku Company / i plik kontrolera CompanyController. To wtedy zadziałało dla mnie, nie poprawka na słowo, ale obejście, jeśli nie utknąłeś na trasie Strona główna / Indeks. Moim innym problemem było to, że nie mogłem znaleźć odniesienia powodującego błąd i ponieważ moja platforma deweloperska to Azure WebApplication vs pełna maszyna wirtualna z pełnym systemem plików i ustawieniami usług IIS, z którymi można zadzierać.


0

Miałem ten sam problem i stwierdziłem, że starsza wersja utworzyła skompilowane pliki w folderze „bin”.

Po ich usunięciu błąd zniknął.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.