Nie znaleziono kontrolera ścieżki lub nie implementuje on IController

79

Mam projekt MVC4 z wyborem języka:

  • en
  • nl
  • fr
  • de

1 główna część z:

  • O
  • Wspólne (dla menu)
  • Kontakt
  • Faq
  • Dom

I 3 obszary:

  • Admin
  • Klienci
  • Sklep

W każdym obszarze mam co najmniej jeden kontroler, na przykład w Admin mam przegląd kontrolera z odpowiednim przeglądem folderu widoku, który zawiera stronę index.aspx .

Strona główna i wszystkie strony główne (informacje, FAQ itp.) Działają i można je odwiedzać).

Jednak gdy podążam za adresem url: localhost: xxxx / en / admin / overview, pojawia się błąd:

Nie znaleziono kontrolera dla ścieżki „/ en / admin / overview” lub nie implementuje on IController.

Mimo że trasa jest poprawna (widzę to w Route Debugger), strona błędu pokazuje również, że błąd został zgłoszony, gdy chciałem załadować moje elementy menu głównego:

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

- Kod usunięty, ponieważ nie ma znaczenia -

Wygląda na to, że wszystko jest w porządku, ale MVC nie jest w stanie załadować menu, które znajduje się w głównej części.

Zatem źródłem problemu jest: Czy mogę przyznać obszarowi (np. Administratorowi) dostęp do kontrolerów w głównej części (dom, wspólny, informacje itp.) Mojego projektu?

reaper_unique
źródło
Czy próbowałeś skomentować wywołanie Html.Action, aby odizolować problem do konkretnego kontrolera?
Jonas Høgh
Jeszcze tego nie zrobiłem, ale teraz to zrobiłem i jest tak, jak myślałem. Administrator obszaru używa układu z głównej części mojego projektu, a gdy osiągnie działanie, obszar próbuje uzyskać dostęp do kontrolera, który nie znajduje się w obszarze, który zgłasza błąd. Innymi słowy, przyczyną problemu jest to, w jaki sposób mogę przyznać dostęp do obszaru kontrolerom w głównej części (domowe, wspólne, informacje itp.) Mojego projektu?
reaper_unique
2
Pytanie brzmi, jak uzyskać więcej możliwych problemów i rozwiązań. Myślę więc, że trzeba przyjrzeć się także innym odpowiedziom, a nie jedynej zaakceptowanej.
Alireza,

Odpowiedzi:

122

Znalazłem to.

Gdy strona, która znajduje się wewnątrz obszaru, chce uzyskać dostęp do kontrolera znajdującego się poza tym obszarem (np. Współdzielonej strony układu lub określonej strony w innym obszarze), obszar tego kontrolera musi zostać dodany. Ponieważ wspólny kontroler nie znajduje się w określonym obszarze, ale jest częścią głównego projektu, musisz pozostawić obszar pusty:

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

Powyższe należy dodać do wszystkich działań i łączy działań, ponieważ strona układu jest współdzielona w różnych obszarach.

To dokładnie ten sam problem, co tutaj: obszary ASP.NET MVC ze współdzielonym układem

Edycja : Żeby było jasne, jest to oznaczone jako odpowiedź, ponieważ była to odpowiedź na mój problem. Powyższe odpowiedzi mogą rozwiązać przyczyny, które powodują ten sam błąd.

reaper_unique
źródło
11
Dzięki, to działało dla mnie. To bardzo mylący komunikat o błędzie z .NET mówiący, że nie można znaleźć kontrolera dla akcji w tym obszarze, co wcale nie jest prawdą!
Richard Fawcett
1
To rozwiązało mój problem. Myślę, że następnym razem powinienem zacząć od odpowiedzi zielonego czeku zamiast na górze listy.
Cameron Belt
„@ Html.Action (" About "," Home ", new {area =" "}) 'zgłasza błąd kompilacji podczas określania go jako pustego obszaru. Jakieś sugestie ?
Thamarai T
16

W moim przypadku ten sam błąd nie był związany z Area, ale pomyślałem o wysłaniu błędu spowodowanego w moim przypadku, co może być pomocne dla osób, które przychodzą do tego wątku, wyszukując „Nie znaleziono kontrolera ścieżki lub nie implementuje IController "

Błąd został spowodowany błędnym wpisem w pliku _Layout.cshtml.

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

Pakiet o tej nazwie został usunięty w BundleConfig.cs, ale zapomniał go usunąć w _Layout.cshtml

To było głupie, ale my programiści zawsze popełniamy wiele głupich błędów :)

Tejasvi Hegde
źródło
1
Dzięki za rozwiązanie. Rzeczywiście jest możliwe, że istnieje wiele rozwiązań pozornie identycznego, ale w rzeczywistości tylko podobnego problemu. Ponieważ jednak moje pytanie mówiło, że używam obszarów, moje własne wybrane rozwiązanie jest nadal najdokładniejsze.
reaper_unique
15

Również dla tych, którym powyższe rozwiązanie nie zadziałało, oto co zadziałało dla mnie:

Mam rozwiązanie z wieloma projektami. Wszystkie projekty były w MVC3. Zainstalowałem Visual Studio 2012 na moim komputerze i wygląda na to, że niektóre projekty zostały automatycznie zaktualizowane do MVC4.

Mam ten problem

Nie znaleziono kontrolera ścieżki „/ etc / etc” lub nie implementuje on IController

ponieważ projekt obsługujący tę trasę wskazywał na MVC4.

Musiałem ręcznie zaktualizować ich odniesienia, aby używać MVC3. Możesz to również zrobić, otwierając plik .csproj za pomocą edytora tekstu. Znajdź odniesienie do MVC3 i usuń ten wiersz:

<SpecificVersion>False</SpecificVersion>
Carlos Martinez T
źródło
2
O mój Boże. To takie przypadkowe i niejasne. Wielkie dzięki za wysłanie! :) PRZYSZŁY CZYTELNIKÓW: Moja była tylko trochę inna - sama wersja dll była 4.0 zamiast 3.0 - nie jestem pewien, jak została zmieniona.
Jared
Problem z moim był podobny; Miałem bibliotekę współdzieloną, do której odwoływała się warstwa prezentacji i zawierała współdzielony kontroler, a biblioteka współdzielona korzystała z mvc4, podczas gdy warstwa prezentacji korzystała z mvc3. Po zaktualizowaniu udostępnionej biblioteki do MVC3 rozwiązałem problem.
jbooker
13

Jeszcze inną możliwą główną przyczyną tego błędu jest to, że przestrzeń nazw dla klasy rejestracji obszaru nie jest zgodna z przestrzenią nazw kontrolera.

Np. Poprawne nazewnictwo w klasie kontrolera:

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

W przypadku nieprawidłowego nazewnictwa w klasie rejestracji obszaru:

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

(Przestrzeń nazw powyżej powinna być MySystem.Areas.Customers.)

Czy kiedykolwiek nauczę się, jak przestać kopiować i wklejać kod? Prawdopodobnie nie.

Carl Sharman
źródło
2
To mnie zaskoczyło i było trudne do znalezienia, ponieważ przestrzeń nazw była nieprawidłowa, gdy znajdowała się w folderze głównego kontrolera (kod skopiowany z innego projektu), ale nie miało to znaczenia, zanim przeniosłem ją do obszaru.
Richard Garside,
12

Ten błąd może być również spowodowany faktem, że kontrolerzy muszą mieć (w swoim imieniu) to słowo Controller; mianowicie: HomeController; chyba że wdrożysz własne ControllerFactory.

George Stocker
źródło
2
To był mój błąd. Dzięki, George!
Wilky
Miałem ten problem. To dlatego, że usunąłem mój plik HomeController.cs i nie rozumiałem, co od niego zależy.
user2023861
Jesteś CEO
Denys Wessels
12

w moim przypadku problem polegał na tym, że klasa kontrolera nie została publicznie ogłoszona.

class WorkPlaceController : Controller

rozwiązaniem było

public class WorkPlaceController : Controller
SoaperPlus
źródło
7

W moim przypadku namespacesparametr nie pasował do przestrzeni nazw kontrolera.

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" }
    );
}
Alexander Puchkov
źródło
6

Oto mój problem i rozwiązanie, które zadziałało.

Dodałem nowy kontroler z pojedynczą akcją zwracającą ciąg znaków do istniejącej aplikacji. Ale kiedy nawigowałem do tego kontrolera przez przeglądarkę, otrzymywałem ten sam błąd, jak wspomniano powyżej.

Po wielu googlach dowiedziałem się, że po prostu muszę zmodyfikować mój plik Global.asax.cs, aby rozpoznawał nowy kontroler. Wszystko, co zrobiłem, to dodanie spacji do pliku Global.asax.cs, aby został zmodyfikowany i działał

armulator
źródło
Mamy 3 produkcyjne serwery WWW i 5 maszyn do tworzenia / testowania. Tylko na jednej maszynie produkcyjnej to nie działało. Dodanie spacji i zapisanie Global.asax naprawiło to. #mindblown
jbwebtech
5

Nie jestem pewien, czy to trafi w rozwiązanie z innego punktu widzenia niż zaakceptowana odpowiedź, ale odkryłem, że jeden z moich kontrolerów w sekcji Obszary siedzi w niewłaściwej przestrzeni nazw. Poprawianie przestrzeni nazw na:

Areas.{AreaName}.Controller

naprawił problem dla mnie.

Podejrzewam, że kluczowym czynnikiem było to, aby wszystkie kontrolery w danym obszarze miały tę samą przestrzeń nazw.

Richard Freeman
źródło
Chciałbym mieć ulubione odpowiedzi, a nie tylko pytania. Trafiłem na tę odpowiedź wiele razy. To było bardzo pomocne, dzięki.
Shelby115
5

Inna przyczyna tego błędu: przypadkowe użycie Html.Action w pliku układu, gdzie Html.ActionLink mogło być zamierzone. Jeśli widok, do którego odwołuje się Html.Action, używa tego samego pliku układu, w praktyce utworzono nieskończoną pętlę. (Widok układu ładuje widok, do którego się odwołujemy, jako widok częściowy, który następnie ładuje widok układu, który ładuje widok, do którego się odnosi ...) Jeśli ustawisz punkt przerwania w pliku układu i wykonasz pojedynczy krok przez Htlm. komunikat o zbyt dużym rozmiarze stosu.

Mike Smith - MCT - MVP
źródło
5

W moim przypadku miałem @{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }w _Layout.cshtml, ale LayoutController nie istniał! (Skopiowałem plik _Layout.cshtml z innego rozwiązania, ale zapomniałem skopiować kontrolera)

Rush Frisby
źródło
4

W moim przypadku w metodzie global.asax / application_start rejestrowałem trasy webowego api PO trasach mvc:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

Przywrócenie kolejności rozwiązało problem

GlobalConfiguration.Configure(WebApiConfig.Register);            
RouteConfig.RegisterRoutes(RouteTable.Routes);
Ege Tuncoz
źródło
2

Jeśli jest to właściwe dla twojego projektu, możesz upewnić się, że modyfikator dostępu w twojej klasie kontrolera jest „publiczny”, a nie czymś, co mogłoby ograniczać dostęp, jak „wewnętrzny” lub „prywatny”.

Chris Halcrow
źródło
2

Żenująco problem w moim przypadku polega na tym , że kodu nie odbudowałem po dodaniu kontrolera .

Więc może pierwszą rzeczą do sprawdzenia jest to, czy kontroler został zbudowany i jest obecny (i publiczny) w plikach binarnych. Możesz zaoszczędzić kilka minut na debugowaniu, jeśli jesteś podobny do mnie.

Tom Pažourek
źródło
1
Oczywiście to był mój problem ... To zawsze są głupie rzeczy, które cię dopadają.
TJ Wolschon
2

Może to być spowodowane złą ścieżką. Więc najpierw sprawdź ścieżkę i pisownię kontrolera. W moim przypadku mój kontroler nazywał się CampsController, a plik WebApiConfig.cs miał w sobie dodatkową ścieżkę.

Zamiast: http: // localhost: 6600 / Camps

Było to: http: // localhost: 6600 / api / Camps

Nie zauważyłem słowa API w pliku WebApiConfig.cs:

config.Routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

Może to być również spowodowane nieprawidłową nazwą kontrolera. Tutaj nazwałem LayoutController, ale zamiast tego powinienem był wywołać Layout:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "LayoutController" })</a>

Powinien być:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "Layout")</a>

Innym przykładem może być zdefiniowanie złych ścieżek tras. Upewnij się, że twoje ścieżki są prawidłowe. Przykład:

   [RoutePrefix("api/camps")]
   public class CampsController : ApiController

   [Route("{moniker}")]
   public async Task<IHttpActionResult> Get(string moniker)
miłość na żywo
źródło
1

W innym scenariuszu chciałbym tylko dodać, że w moim scenariuszu przestrzeń nazw była inna dla kontrolera, ponieważ był to błąd kopiowania kontrolera z innego projektu.

Życie Pi
źródło
1

W moim przypadku starszej aplikacji problem wystąpił, gdy dodałem poniższy wpis w pliku web.config pod węzłem <system.webServer>

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

Kiedy go usunąłem, problem został rozwiązany.

Prashant Deherkar
źródło
1

Ten problem występuje również, jeśli nie uwzględnisz klasy kontrolera dla procesu kompilacji w plikach .csproj.

<Compile Include="YOUR_CONTROLLER_PATH.cs" />
Ismail Yilmaz
źródło
1

Opierając się na tej odpowiedzi George'a, stwierdziłem w moim przypadku, że ustawiłem kontroler prawidłowo, ponieważ ThingControlleri miałem odpowiednio zdefiniowaną metodę na tym kontrolerzeEdit .

Ale… odnosiłem się do tego moim zdaniem z

<a href="https://stackoverflow.com/App/ThingController/Edit" />

Gdzie powinienem po prostu użyć nazwy bez kontrolera słowa takiego jak

<a href="https://stackoverflow.com/App/Thing/Edit" />

MysticVagabond
źródło
1

W moim przypadku renderowałem inną metodę akcji dla mojej sekcji menu w pliku _layout.cshtml przy użyciu @ Html.Action ("Menu", "Menu"), podczas gdy zapomniałem utworzyć kontroler Menu, a plik układu był używany w moim bieżącym widok akcji kontrolera, dlatego otrzymałem ten błąd w moim bieżącym żądaniu renderowania akcji. spróbuj spojrzeć na swój układ, a także przejrzeć plik, jeśli popełniłeś ten sam błąd

Neeraj Singh
źródło
0

Ktoś dodał to do widoku.

@Scripts.Render("~/bundles/jqueryval")

Następnie dodali BundleConfig.csplik do App_Startfolderu.
W RegisterBundlesMetodzie mieli:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js"));

Jednak zapomnieli dokończyć okablowania tego wGlobal.asax.cspliku.
Aby naprawić, wszystko, co musiałem zrobić, to dodać to doApplication_Startmetody wGlobal.asax.cs:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Uwaga: Myślę, że kolejność / umieszczenie tego wiersza w Application_Startmetodzie ma znaczenie,
więc proszę o tym pamiętać.
Natychmiast położyłem mój ViewEngines.

MikeTeeVee
źródło
0

A może przegapiłeś słowo kluczowe „Kontroler” na końcu nazwy kontrolera;)

Hoàng Nghĩa
źródło
0

Mam nadzieję, że to pomoże komuś innemu. Miałem ten problem, ponieważ podczas gdy miałem poprawnie nazwany kontroler, klasa w pliku zawierała literówkę. Szukałem OrderSearch, a plik to OrderSearchController.cs, ale klasa to OrdersSearchController.

Oczywiście powinny pasować, ale nie muszą, a Twoja trasa jest ukierunkowana na klasę, a nie na nazwę pliku.

John Lord
źródło