Подтвердить что ты не робот

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

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

  • ан
  • п
  • фр
  • де

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, похоже, не может загрузить меню, которое находится в основной части.

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

4b9b3361

Ответ 1

Я нашел его.

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

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

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

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

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

Ответ 2

В моем случае такая же ошибка не была связана с Area, но подумала о том, чтобы опубликовать ошибку, вызванную в моем случае, что может быть полезно для людей, которые приходят в этот поток, путем поиска "Контроллер для пути не найден или не работает не осуществлять IController"

Ошибка была вызвана неправильной записью в файле _Layout.cshtml.

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

Пакет с этим именем был удален в BundleConfig.cs, но забыл удалить его в _Layout.cshtml

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

Ответ 3

Кроме того, для тех, у кого решение выше не сработало, вот что сработало для меня:

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

У меня возникла проблема

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

потому что проект, который обрабатывал этот маршрут, указывал на MVC4.

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

<SpecificVersion>False</SpecificVersion>

Ответ 4

Эта ошибка также может быть вызвана тем, что контроллеры должны иметь (от своего имени) слово Controller; а именно: HomeController; если вы не реализуете свой собственный ControllerFactory.

Ответ 5

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

class WorkPlaceController : Controller

решение было

public class WorkPlaceController : Controller

Ответ 6

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

например. правильное присвоение имени классу контроллера:

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

С неправильным названием в классе регистрации области:

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

(Пространство имен выше должно быть MySystem.Areas.Customers.)

Я когда-нибудь научусь прекращать копирование и вставку кода? Наверное, нет.

Ответ 7

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

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

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

Ответ 8

В моем случае параметр 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" }
    );
}

Ответ 9

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

Areas.{AreaName}.Controller

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

Если это соответствует вашему дизайну, вы можете убедиться, что модификатор доступа на вашем классе контроллера является "общедоступным", а не тем, что может ограничить доступ, например "внутренний" или 'private'.

Ответ 13

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

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

Ответ 14

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

Ответ 15

В моем случае устаревшего приложения проблема возникла, когда я добавил ниже запись в файле web.config в разделе node <system.webServer>

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

Когда я удалю его, проблема будет решена.

Ответ 16

Эта проблема также возникает, если вы не включили ваш класс контроллера для процесса компиляции в файлы .csproj.

<Compile Include="YOUR_CONTROLLER_PATH.cs" />

Ответ 17

В моем случае в методе global.asax/application_start я регистрировал маршруты web api ПОСЛЕ маршрутов mvc следующим образом:

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

Отмена заказа исправила проблему

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

Ответ 18

В моем случае это было потому, что контроллер был назван неправильно. Я вызвал LayoutController, но вместо этого должен был вызвать Layout:

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

должно быть:

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

Ответ 19

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

Ответ 20

Основываясь на этом ответе Джорджа, я обнаружил, что в моем случае я правильно настроил свой контроллер как ThingController и у меня был правильно определенный метод для этого контроллера Edit.

Но.. Я ссылался на это с моей точки зрения

<a href="/App/ThingController/Edit"/>

Где я должен был просто использовать имя без слова контроллера, как

<a href="/App/Thing/Edit"/>