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?
źródło
Odpowiedzi:
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.
źródło
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 :)
źródło
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
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:
źródło
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.
źródło
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łasneControllerFactory
.źródło
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
źródło
W moim przypadku
namespaces
parametr 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" } ); }
źródło
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ł
źródło
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:
naprawił problem dla mnie.
Podejrzewam, że kluczowym czynnikiem było to, aby wszystkie kontrolery w danym obszarze miały tę samą przestrzeń nazw.
źródło
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.
źródło
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)źródło
W moim przypadku w metodzie global.asax / application_start rejestrowałem trasy webowego api PO trasach mvc:
Przywrócenie kolejności rozwiązało problem
źródło
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”.
źródło
Ż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.
źródło
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)
źródło
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.
źródło
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.
źródło
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" />
źródło
Opierając się na tej odpowiedzi George'a, stwierdziłem w moim przypadku, że ustawiłem kontroler prawidłowo, ponieważ
ThingController
i 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" />
źródło
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
źródło
Ktoś dodał to do widoku.
@Scripts.Render("~/bundles/jqueryval")
Następnie dodali
BundleConfig.cs
plik doApp_Start
folderu.W
RegisterBundles
Metodzie mieli:bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js"));
Jednak zapomnieli dokończyć okablowania tego w
Global.asax.cs
pliku.Aby naprawić, wszystko, co musiałem zrobić, to dodać to do
Application_Start
metody wGlobal.asax.cs
:Uwaga: Myślę, że kolejność / umieszczenie tego wiersza w
Application_Start
metodzie ma znaczenie,więc proszę o tym pamiętać.
Natychmiast położyłem mój
ViewEngines
.źródło
A może przegapiłeś słowo kluczowe „Kontroler” na końcu nazwy kontrolera;)
źródło
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.
źródło