У меня есть проект 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, похоже, не может загрузить меню, которое находится в основной части.
Итак, корень проблемы: Могу ли я предоставить доступ области (например, администратора) к контроллерам в основной части (домашняя, общая, около и т. Д.) Моего проекта?
источник
Ответы:
Я нашел это.
Когда страница, находящаяся внутри области, хочет получить доступ к контроллеру, расположенному за пределами этой области (например, к общей странице макета или определенной странице внутри другой области), необходимо добавить область этого контроллера. Поскольку общий контроллер находится не в определенной области, а является частью основного проекта, вы должны оставить область пустой:
@Html.Action("MenuItems", "Common", new {area="" })
Вышеупомянутое должно быть добавлено ко всем действиям и ссылкам на действия, поскольку страница макета используется в различных областях.
Это точно такая же проблема, как здесь: области ASP.NET MVC с общим макетом
Изменить : для ясности, это помечено как ответ, потому что это был ответ на мою проблему. Приведенные выше ответы могут устранить причины, вызывающие ту же ошибку.
источник
В моем случае та же ошибка не была связана с Area, но я думал опубликовать ошибку, вызванную в моем случае, что может быть полезно для людей, которые заходят в эту ветку с помощью поиска «Контроллер для пути не найден или не реализует IController. "
Ошибка возникла из-за неправильной записи в файле _Layout.cshtml.
@Styles.Render("~/Content/misc")
Пакет с таким именем был удален из BundleConfig.cs, но забыл удалить его в _Layout.cshtml
Это было глупо, но мы, программисты, всегда делаем много глупых ошибок :)
источник
Кроме того, для тех, у кого вышеприведенное решение не сработало, вот что сработало для меня:
У меня есть решение с несколькими проектами. Все проекты были в MVC3. Я установил Visual Studio 2012 на свой компьютер, и кажется, что некоторые проекты были автоматически обновлены до MVC4.
У меня проблема
потому что проект, который обрабатывал этот маршрут, указывал на MVC4.
Мне пришлось вручную обновить их ссылки, чтобы использовать MVC3. Вы также можете сделать это, открыв файл .csproj в текстовом редакторе. Найдите ссылку на MVC3 и удалите эту строку:
источник
Еще одна возможная основная причина этой ошибки - если пространство имен для класса регистрации области не совпадает с пространством имен для контроллера.
Например, правильное название класса контроллера:
namespace MySystem.Areas.Customers { public class CustomersController : Controller { ... } }
При неправильном названии класса регистрации области:
namespace MySystem.Areas.Shop { public class CustomersAreaRegistration : AreaRegistration { ... } }
(Пространство имен выше должно быть
MySystem.Areas.Customers
.)Смогу ли я когда-нибудь перестать копировать и вставлять код? Возможно нет.
источник
Эта ошибка также может быть вызвана тем, что Контроллеры должны иметь (в своем имени) слово
Controller
; а именно:HomeController
; если вы не реализуете свой собственныйControllerFactory
.источник
в моем случае проблема заключалась в том, что класс контроллера не был объявлен публично.
class WorkPlaceController : Controller
решение было
public class WorkPlaceController : Controller
источник
В моем случае
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" } ); }
источник
Вот моя проблема и решение, которое сработало для меня.
Я добавил новый контроллер с одним действием, возвращающим строку в существующее приложение. Но когда я перешел к этому контроллеру через браузер, я получал ту же ошибку, что и упоминалось выше.
После большого количества поисков в Google я обнаружил, что мне просто нужно изменить мой файл Global.asax.cs, чтобы он распознал новый контроллер. Все, что я сделал, это добавил пробел в файл Global.asax.cs, чтобы он был изменен и работал
источник
Не уверен, что это относится к решению под другим углом к принятому ответу, но я обнаружил, что один из моих контроллеров в разделе областей находится в неправильном пространстве имен. Исправление пространства имен на:
исправил проблему для меня.
Я подозреваю, что ключевым фактором было то, что все контроллеры в данной области использовали одно и то же пространство имен.
источник
Еще одна причина этой ошибки: случайное использование Html.Action в файле макета, где могло быть предназначено Html.ActionLink. Если представление, на которое ссылается Html.Action, использует тот же файл макета, вы фактически создали бесконечный цикл. (Представление макета загружает указанное представление как частичное представление, которое затем загружает представление макета, которое загружает указанное представление ...) Если вы установите точку останова в файле макета и выполните один шаг через Htlm.Action, вы иногда получите более полезный сообщение о чрезмерном размере стека.
источник
В моем случае у меня был
@{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }
_Layout.cshtml, но LayoutController не существовал! (Я скопировал _Layout.cshtml из другого решения, но забыл скопировать контроллер)источник
В моем случае в методе global.asax / application_start я регистрировал маршруты веб-API ПОСЛЕ маршрутов mvc следующим образом:
Отмена заказа устранила проблему
источник
Если это соответствует вашему дизайну, вы можете убедиться, что модификатор доступа в вашем классе контроллера является «общедоступным», а не чем-то, что может ограничивать доступ, например «внутренний» или «частный».
источник
Как ни странно, проблема в моем случае в том, что я не перестроил код после добавления контроллера. .
Так что, возможно, первое, что нужно проверить, это то, что ваш контроллер был собран и присутствует (и общедоступен) в двоичных файлах. Если вы похожи на меня, это может сэкономить вам несколько минут на отладку.
источник
Это могло быть из-за неправильного пути. Поэтому сначала проверьте путь и написание контроллера. В моем случае мой контроллер был назван 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)
источник
В другом сценарии я просто хотел бы добавить: В моем сценарии пространство имен было другим для контроллера, поскольку это было ошибкой при копировании контроллера из другого проекта.
источник
В моем случае устаревшего приложения проблема возникла, когда я добавил ниже запись в файл web.config под узлом
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"></modules>
Когда я его удалил, проблема решилась.
источник
Эта проблема также возникает, если вы не включаете свой класс контроллера для процесса компиляции в файлы .csproj.
<Compile Include="YOUR_CONTROLLER_PATH.cs" />
источник
Основываясь на этом ответе Джорджа, я обнаружил в своем случае, что я правильно настроил свой контроллер,
ThingController
и у меня есть правильно определенный метод на этом контроллереEdit
.Но ... я ссылался на это, на мой взгляд, с
<a href="https://stackoverflow.com/App/ThingController/Edit" />
Где я должен был просто использовать имя без слова контроллер, например
<a href="https://stackoverflow.com/App/Thing/Edit" />
источник
В моем случае я визуализировал другой метод действия для раздела меню в файле _layout.cshtml, используя @ Html.Action («Меню», «Меню»), тогда как я забыл создать контроллер меню, и поскольку файл макета использовался в моем текущем представление действия контроллера, поэтому я получал эту ошибку в моем текущем запросе рендеринга действия. попробуйте посмотреть в макете, а также просмотреть файл, если вы сделали ту же ошибку
источник
Кто-то добавил это в представление.
@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
:Примечание: я думаю, что порядок / размещение этой строки в
Application_Start
методе имеет значение,поэтому имейте это в виду.
Я поставил свой сразу после
ViewEngines
.источник
А может, вы пропустили ключевое слово «Контроллер» в конце имени контроллера;)
источник
Надеюсь, это поможет кому-то другому. У меня была эта проблема, потому что, хотя у меня был правильно назван контроллер, в классе внутри файла была опечатка. Я искал OrderSearch, и это был файл OrderSearchController.cs, но класс был OrdersSearchController.
Очевидно, они должны совпадать, но это не обязательно, и ваш маршрут нацелен на класс, а не на имя файла.
источник