Контролер шляху не знайдений або не реалізує IController


79

У мене є проект MVC4 з вибором мови:

  • en
  • nl
  • fr
  • де

1 основна частина з:

  • Про
  • Загальний (для меню)
  • Зв'язок
  • Часті запитання
  • Додому

І 3 напрямки:

  • Адміністратор
  • Клієнти
  • Магазин

У кожній області у мене є по крайней мере , один контролер, наприклад , в адміністратора У мене є контролер огляд з відповідним видом папки оглядом , який містить index.aspx сторінки.

Домашня сторінка та всі основні сторінки (про, часто задані питання тощо) працюють і їх можна відвідати).

Однак, коли я стежу за url: localhost: xxxx / en / admin / overview, я отримую помилку:

Контролер для шляху '/ en / admin / overview' не знайдений або не реалізує IController.

Незважаючи на те, що маршрут правильний (я бачу це за допомогою налагоджувача маршрутів), на сторінці помилки також видно, що помилка була викинута, коли я хотів завантажити свої пункти головного меню:

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

- Код видалено, оскільки він не має значення -

Здається, все в порядку, але MVC, здається, не зможе завантажити меню, яке знаходиться в основній частині.

Отже, корінь проблеми полягає в наступному: Чи можу я надати області (наприклад, адміністратору) доступ до контролерів в основній частині (домашній, загальний, про тощо) мого проекту?


Ви пробували коментувати виклик Html.Action, щоб ізолювати проблему до конкретного контролера?
Jonas Høgh

Я ще не мав, але зараз зробив, і це так, як я думав. Область Адміністратор використовує макет з основної частини мого проекту , і коли вона досягає Акцію область намагається отримати доступ до контролера , який не перебуває у районі , який кидає помилку. Іншими словами, корінь проблеми полягає в тому, як я можу надати доступ до області контролерам в основній частині (домашній, загальний, контролер тощо) мого проекту?
reaper_unique

2
Питання полягає в отриманні більше можливих проблем та рішень. Тож, я думаю, треба також поглянути на інші відповіді, і не єдину прийняту.
Аліреза

Відповіді:


122

Я знайшов це.

Коли сторінка, яка знаходиться всередині певної області, хоче отримати доступ до контролера, який знаходиться поза цією областю (наприклад, сторінка спільного макета або певна сторінка всередині іншої області), потрібно додати область цього контролера. Оскільки загальний контролер знаходиться не в певній області, а є частиною основного проекту, вам слід залишити область порожньою:

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

Вищезазначене потрібно додати до всіх дій та посилань на дії, оскільки сторінка макета є спільною для різних областей.

Це точно така ж проблема, як і тут: Області ASP.NET MVC із загальним макетом

Редагувати : Щоб бути зрозумілим, це позначено як відповідь, оскільки це була відповідь на мою проблему. Наведені вище відповіді можуть вирішити причини, що викликають ту саму помилку.


11
Дякую, це спрацювало на мене. Це дуже оманливе повідомлення про помилку від .NET, яке говорить про те, що контролер для дії в межах області не може бути знайдений, що зовсім не так!
Річард Фосетт

1
Це вирішило мою проблему. Думаю, наступного разу мені слід почати із зеленої галочки, а не з верхньої частини списку.
Cameron Belt

'@ Html.Action ("About", "Home", new {area = ""})' видає помилку компіляції, коли вказує її як порожню область. Будь-які пропозиції ?
Thamarai T

16

У моєму випадку та сама помилка не була пов’язана з Area, але думали розмістити помилку, спричинену в моєму випадку, що може бути корисно для людей, які прийшли до цієї теми, шукаючи «Контролер шляху не знайдений або не реалізує IController "

Помилка виникла через неправильний запис у файлі _Layout.cshtml.

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

Пачку з таким ім'ям було видалено в BundleConfig.cs, але забули видалити в _Layout.cshtml

Це було безглуздо, але ми, програмісти, завжди робимо багато дурних помилок :)


1
Дякую за рішення. Дійсно можливо, що існує безліч рішень на перший погляд ідентичних, але насправді лише подібних проблем. Однак, оскільки в моєму запитанні було зазначено, що я використовую області, моє обране рішення все ще є найбільш точним.
reaper_unique

15

Крім того, для тих, хто наведене вище рішення не спрацювало, ось що мені вдалося:

У мене є рішення з кількома проектами. Всі проекти були в MVC3. Я встановив Visual Studio 2012 на своїй машині, і, схоже, деякі проекти були автоматично оновлені до MVC4.

У мене ця проблема

Контролер для шляху '/ etc / etc' не знайдений або не реалізує IController

оскільки проект, який керував цим маршрутом, вказував на MVC4.

Мені довелося вручну оновити їх посилання, щоб використовувати MVC3. Ви також можете зробити це, відкривши файл .csproj за допомогою текстового редактора. Знайдіть посилання на MVC3 і видаліть цей рядок:

<SpecificVersion>False</SpecificVersion>

2
О Боже. Це так випадково і неясно. Велике спасибі за публікацію! :) МАЙБУТНІ ЧИТАТЕЛІ: Моя була дещо іншою - сама версія dll була 4.0 замість 3.0 - я не знаю, як це змінилося.
Джаред,

Проблема з моєю була подібною; У мене була спільна бібліотека, на яку посилався рівень презентації та містив спільний контролер, а спільна бібліотека використовувала mvc4, тоді як презентаційний рівень використовував mvc3. Після оновлення спільної бібліотеки до MVC3 це вирішило проблему.
jbooker

13

Ще однією можливою першопричиною цієї помилки є те, що простір імен для класу реєстрації області не відповідає простору імен для контролера.

Наприклад, правильне іменування класу контролера:

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

При неправильному іменуванні в класі реєстрації району:

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

(Простір імен вище має бути MySystem.Areas.Customers.)

Чи навчуся я коли-небудь зупиняти копіювання та вставку коду? Можливо, ні.


2
Це мене зачепило і важко було знайти, оскільки простір імен був неправильним, коли він знаходився в папці кореневого контролера (код скопійований з іншого проекту), але це не мало значення, перш ніж я перемістив його в область.
Річард Гарсайд

12

Ця помилка також може бути викликана тим, що контролери повинні мати (від свого імені) це слово Controller; а саме: HomeController; якщо ви не реалізуєте свою власну ControllerFactory.


2
Це була моя помилка. Дякую Георгію!
Wilky

У мене була ця проблема. Це було тому, що я видалив свій файл HomeController.cs і не зрозумів, що від цього залежить.
user2023861

Ви генеральний директор
Деніс Вессельс,

12

у моєму випадку проблема полягала в тому, що клас контролера не був публічно оголошений.

class WorkPlaceController : Controller

рішення було

public class WorkPlaceController : Controller

7

У моєму випадку namespacesпараметр не відповідав простору імен контролера.

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

6

Ось моя проблема і рішення, що з мене спрацювало.

Я додав новий контролер однією дією, що повертає рядок до існуючого додатка. Але коли я перейшов до цього контролера через браузер, у мене з’явилася та сама помилка, що й згадана вище.

Провівши багато гуглів, я виявив, що мені просто довелося змінити файл Global.asax.cs, щоб він розпізнавав новий контролер. Все, що я зробив, додало пробіл до файлу Global.asax.cs, щоб він був змінений і він працював


У нас є 3 робочих веб-сервери та 5 розробників / тестових машин. Лише на одній виробничій машині вона не працювала. Додавши пробіл та заощадивши Global.asax це виправило. #mindblown
jbwebtech

5

Не впевнений, чи потрапляє це рішення з іншого боку на прийняту відповідь, але я виявив, що один із моїх контролерів у розділі "Області" сидів у неправильному просторі імен. Виправлення простору імен на:

Areas.{AreaName}.Controller

вирішив проблему для мене.

Я підозрюю, що ключовим фактором було те, що всі контролери в певній області мають спільний простір імен.


Бажаю, щоб ви могли улюблені відповіді, а не лише питання. Я стільки разів натрапляв на цю відповідь. Це було просто так корисно, дякую.
Шелбі115,

5

Ще одна причина цієї помилки: випадкове використання Html.Action у файлі макета, де, можливо, було призначено Html.ActionLink. Якщо подання, на яке посилається Html.Action, використовує той самий файл макета, ви фактично створили нескінченний цикл. (Вид макета завантажує посилання як частковий вигляд, а потім завантажує вигляд макета, який завантажує подання, на яке посилається ...) Якщо ви встановите точку зупинки у файлі макета і один крок через Htlm.Action, іноді ви отримаєте більш корисний повідомлення про надмірний розмір стека.


5

У моєму випадку у мене було @{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }_Layout.cshtml, але LayoutController не існував! (Я скопіював _Layout.cshtml з іншого рішення, але забув скопіювати контролер)


4

У моєму випадку в методі global.asax / application_start я реєстрував маршрути веб-api ПІСЛЯ маршрутів mvc так:

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

Скасування замовлення вирішило проблему

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

2

Якщо це підходить для вашого дизайну, ви можете переконатися, що модифікатор доступу у вашому класі контролера є "загальнодоступним", а не тим, що може обмежити доступ, наприклад "внутрішній" або "приватний".


2

Прикро, але проблема в моєму випадку полягає в тому, що я не відновив код після додавання контролера .

Тож, можливо, перше, що слід перевірити, це те, що ваш контролер був побудований і присутній (і є загальнодоступним) у двійкових файлах. Якщо ви схожі на мене, це може заощадити вам кілька хвилин налагодження.


1
Звичайно, це була моя проблема ... Завжди дурі речі наводять тебе на розум.
TJ Wolschon,

2

Це може бути тому, що шлях був неправильний. Тож спочатку перевірте шлях та орфографію контролера. У моєму випадку мій контролер був названий CampsController, і файл WebApiConfig.cs мав у ньому додатковий шлях.

Замість: http: // localhost: 6600 / Camps

Це було: http: // localhost: 6600 / api / Camps

Я не помітив слова api у файлі WebApiConfig.cs:

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

Також це може бути тому, що контролер був неправильно названий. Тут я зателефонував LayoutController, але замість цього мав би викликати Layout:

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

має бути:

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

Інший приклад - це може бути через те, що у вас визначені погані шляхи маршруту. Переконайтесь, що ваші шляхи правильні. Приклад:

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

   [Route("{moniker}")]
   public async Task<IHttpActionResult> Get(string moniker)

1

В іншому сценарії, який я хотів би додати, це: У моєму сценарії простір імен відрізнявся для контролера, оскільки помилкою було копіювання контролера з іншого проекту.


1

У моєму випадку застарілої програми проблема сталася, коли я додав нижче запис у файл web.config під вузлом <system.webServer>

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

Коли я його видалив, проблема вирішена.


1

Ця проблема також виникає, якщо ви не включите свій клас контролера для процесу компіляції у файли .csproj.

<Compile Include="YOUR_CONTROLLER_PATH.cs" />

1

Спираючись на цю відповідь Джорджа, я виявив у своєму випадку, що я правильно встановив свій контролер, як ThingControllerі мав правильно визначений метод на цьому контролері Edit.

Але .. Я посилався на це, на мій погляд, з

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

Там, де я повинен був просто вживати це ім'я без контролера слів типу

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


1

У моєму випадку я робив інший метод дій для мого розділу меню у файлі _layout.cshtml, використовуючи @ Html.Action ("Меню", "Меню"), тоді як я забув створити контролер меню і оскільки файл макета використовувався в моєму поточному подання дії контролера, тому я отримав цю помилку в моєму поточному запиті на відтворення. спробуйте переглянути ваш макет, а також переглянути файл, якщо ви зробили ту ж помилку


0

Хтось додав це до подання.

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

Потім вони додали BundleConfig.csфайл у App_Startпапку.
У RegisterBundlesМетоді вони мали:

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

Однак вони забули закінчити підключення цього доGlobal.asax.csфайлу.
Щоб виправити, мені потрібно було лише додати це доApplication_Startметоду вGlobal.asax.cs:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Примітка: Я думаю, що порядок / розміщення цього рядка у Application_StartМетоді має значення,
тому, будь ласка, майте це на увазі.
Я розмістив свою відразу після ViewEngines.


0

Або, можливо, ви пропустили ключове слово "Контролер" в кінці імені контролера;)


0

Сподіваюся, це допомагає комусь іншому. У мене була ця проблема, тому що, хоча у мене був належним чином названий контролер, клас всередині файлу мав помилку. Я шукав OrderSearch, і файл був OrderSearchController.cs, але клас - OrdersSearchController.

Очевидно, вони повинні збігатися, але вони не повинні, і ваш маршрут націлений на клас, а не на ім'я файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.