Контроллер для пути не найден или не реализует IController

79

У меня есть проект MVC4 с выбором языка:

  • en
  • нл
  • fr
  • де

1 основная часть с:

  • Около
  • Общие (для меню)
  • Связаться с нами
  • Часто задаваемые вопросы
  • Главная

И 3 области:

  • Админ
  • Клиенты
  • Магазин

В каждой области у меня есть хотя бы один контроллер, например, в Admin у меня есть обзор контроллера с обзором соответствующей папки просмотра, который содержит страницу index.aspx .

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

Однако, когда я следую URL: localhost: xxxx / en / admin / overview, я получаю сообщение об ошибке:

Контроллер для пути '/ en / admin / overview' не найден или не реализует IController.

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

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

- Код удален, поскольку не имеет отношения к делу -

Вроде бы все в порядке, но MVC, похоже, не может загрузить меню, которое находится в основной части.

Итак, корень проблемы: Могу ли я предоставить доступ области (например, администратора) к контроллерам в основной части (домашняя, общая, около и т. Д.) Моего проекта?

reaper_unique
источник
Вы пробовали закомментировать вызов Html.Action, чтобы изолировать проблему от конкретного контроллера?
Jonas Høgh
Я еще не знал, но теперь сделал, и все так, как я думал. Область Администратор использует макет из основной части моего проекта , и когда она достигает Акцию область пытается получить доступ к контроллеру , который не находится в районе , который бросает ошибку. Другими словами, корень проблемы в том, как я могу предоставить доступ к области контроллерам в основной части (домашние, общие, примерно и т. Д. Контроллеры) моего проекта?
reaper_unique
2
Вопрос в том, чтобы получить больше возможных проблем и решений. Так что, я думаю, необходимо посмотреть и на другие ответы, а не на единственный принятый.
Алиреза

Ответы:

122

Я нашел это.

Когда страница, находящаяся внутри области, хочет получить доступ к контроллеру, расположенному за пределами этой области (например, к общей странице макета или определенной странице внутри другой области), необходимо добавить область этого контроллера. Поскольку общий контроллер находится не в определенной области, а является частью основного проекта, вы должны оставить область пустой:

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

Вышеупомянутое должно быть добавлено ко всем действиям и ссылкам на действия, поскольку страница макета используется в различных областях.

Это точно такая же проблема, как здесь: области ASP.NET MVC с общим макетом

Изменить : для ясности, это помечено как ответ, потому что это был ответ на мою проблему. Приведенные выше ответы могут устранить причины, вызывающие ту же ошибку.

reaper_unique
источник
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

Это было глупо, но мы, программисты, всегда делаем много глупых ошибок :)

Tejasvi Hegde
источник
1
Спасибо за решение. Действительно, возможно, что существует несколько решений, казалось бы, идентичной, но на самом деле похожей проблемы. Однако, поскольку в моем вопросе говорилось, что я использую области, выбранное мной решение по-прежнему является наиболее точным.
reaper_unique 01
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 01
Вы генеральный директор
Денис Весселс
12

в моем случае проблема заключалась в том, что класс контроллера не был объявлен публично.

class WorkPlaceController : Controller

решение было

public class WorkPlaceController : Controller
SoaperPlus
источник
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

Вот моя проблема и решение, которое сработало для меня.

Я добавил новый контроллер с одним действием, возвращающим строку в существующее приложение. Но когда я перешел к этому контроллеру через браузер, я получал ту же ошибку, что и упоминалось выше.

После большого количества поисков в Google я обнаружил, что мне просто нужно изменить мой файл Global.asax.cs, чтобы он распознал новый контроллер. Все, что я сделал, это добавил пробел в файл Global.asax.cs, чтобы он был изменен и работал

армулятор
источник
У нас есть 3 производственных веб-сервера и 5 машин для разработки и тестирования. Только на одной производственной машине он не работал. Это исправлено добавлением пробела и сохранением Global.asax. #mindblown
jbwebtech 09
5

Не уверен, что это относится к решению под другим углом к ​​принятому ответу, но я обнаружил, что один из моих контроллеров в разделе областей находится в неправильном пространстве имен. Исправление пространства имен на:

Areas.{AreaName}.Controller

исправил проблему для меня.

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

Ричард Фриман
источник
Желаю вам любимых ответов, а не только вопросов. Я уже много раз сталкивался с этим ответом. Это было так полезно, спасибо.
Shelby115 05
5

Еще одна причина этой ошибки: случайное использование Html.Action в файле макета, где могло быть предназначено Html.ActionLink. Если представление, на которое ссылается Html.Action, использует тот же файл макета, вы фактически создали бесконечный цикл. (Представление макета загружает указанное представление как частичное представление, которое затем загружает представление макета, которое загружает указанное представление ...) Если вы установите точку останова в файле макета и выполните один шаг через Htlm.Action, вы иногда получите более полезный сообщение о чрезмерном размере стека.

Майк Смит - MCT - MVP
источник
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.

MikeTeeVee
источник
0

А может, вы пропустили ключевое слово «Контроллер» в конце имени контроллера;)

Хоанг Нгха
источник
0

Надеюсь, это поможет кому-то другому. У меня была эта проблема, потому что, хотя у меня был правильно назван контроллер, в классе внутри файла была опечатка. Я искал OrderSearch, и это был файл OrderSearchController.cs, но класс был OrdersSearchController.

Очевидно, они должны совпадать, но это не обязательно, и ваш маршрут нацелен на класс, а не на имя файла.

Джон Лорд
источник