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


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

  • en
  • nl
  • fr
  • de

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

  • о
  • общие (для меню)
  • контакты
  • часто задаваемые вопросы
  • дома

и 3 зоны:

  • Admin
  • клиенты
  • магазин

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

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

однако, когда я следую url: localhost: xxxx / en / admin / обзор Я получаю ошибку

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

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

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

-- код удален, потому что не имеет значения --

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

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

17 66

17 ответов:

Я нашел его.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

потому что проект, который обрабатывается, что маршрут был указывая на помощью MVC4.

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

<SpecificVersion>False</SpecificVersion>

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

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

class WorkPlaceController : Controller

решение

public class WorkPlaceController : Controller

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

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

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

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

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

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

научусь ли я когда-нибудь перестать копировать и вставлять код? Скорее всего, нет.

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

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

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

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

Areas.{AreaName}.Controller

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

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

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

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

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

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

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

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

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

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

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

когда я удалил его, вопрос решен.

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

<Compile Include="YOUR_CONTROLLER_PATH.cs" />

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

но.. Я ссылался на него в моем представлении с

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

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

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