it-swarm.com.ru

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

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

  • ан
  • п
  • фр
  • де

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

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

И 3 области:

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

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

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

Однако, когда я следую за 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) доступ к контроллерам в основной части (домашней, общей, общей и т.д.) Моего проекта?

66
reaper_unique

Я нашел это.

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

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

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

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

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

108
reaper_unique

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

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

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

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

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

14
Tejasvi Hegde

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

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

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

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

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

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

<SpecificVersion>False</SpecificVersion>
14
Carlos Martinez T

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

12
George Stocker

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

class WorkPlaceController : Controller

решение было

public class WorkPlaceController : Controller
11
SoaperPlus

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

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

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

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

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

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

Буду ли я когда-нибудь учиться останавливать копирование и вставку кода? Возможно нет.

9
Carl

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

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

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

6
armulator

В моем случае параметр 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
Alexander Puchkov

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

5
Rush Frisby

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

Areas.{AreaName}.Controller

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

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

5
Richard Freeman

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

4
Mike Smith - MCT - MVP

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

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

2
Tom Pažourek

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

1
Chris Halcrow

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

1
LifeOfPi

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

<Compile Include="YOUR_CONTROLLER_PATH.cs" />
1
Ismail Yilmaz

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

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

Когда я его убрал, проблема разрешилась. 

1
Prashant Deherkar

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

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

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

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

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

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

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

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

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

0
Xynos