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!

mattruma
źródło
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.

David Ruttka
źródło
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" }
        );
cooloverride
źródło
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.

Reynaldo
źródło
2

Użyj tego

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "ProjectName.Controllers" }
        );
krakers
źródło
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
glownet
źródło
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
    }
Leonel Sanches da Silva
źródło
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;
XzaR
źródło
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.

Logan Miller
źródło
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ć.

Eddie.Power_AU
źródło
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ął.

Pavan Arunod
źródło