找不到路径控制器或未实现IController


79

我有一个带有语言选择的MVC4项目:

  • nl
  • fr

1个主要部分包括:

  • 关于
  • 通用(用于菜单)
  • 联系
  • 常问问题

和3个领域:

  • 管理员
  • 顾客

在每个区域中,我至少有一个控制器,例如在Admin中,我具有控制器概述以及相应的视图文件夹概述,其中包含index.aspx页面。

主页和所有主页(关于,常见问题等)都可以使用并且可以访问)。

但是,当我按照以下网址进行操作时:localhost:xxxx / en / admin / overview我收到错误消息:

找不到路径“ / en / admin / overview”的控制器或未实现IController。

即使路由正确(我可以使用Route Debugger看到),错误页面也显示当我要加载主菜单项时抛出了错误:

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

-由于不相关而删除了代码-

一切似乎都井井有条,但是MVC似乎无法加载位于主要部分的菜单。

因此,问题的根源是:我可以在我的项目的主要部分(家庭,公共,关于等)中授予区域访问控制器的权限(例如Admin)吗?


您是否尝试注释掉对Html.Action的调用以将问题隔离到特定控制器?
乔纳斯·霍(JonasHøgh)2012年

我还没有,但是现在我做到了,这就是我的想法。Area Admin使用项目主要部分中的布局,当它到达Action时,该区域尝试访问不在该区域中的控制器,从而引发错误。换句话说,问题的根源在于,如何为项目的主要部分(家庭,公共,关于控制器等)中的控制器授予区域访问权限?
reaper_unique 2012年

2
问题是越来越多的可能的问题和解决方案。因此,我认为这也是必须考虑其他答案,而不是唯一被接受的答案。
Alireza 2015年

Answers:


121

我找到了

当位于某个区域内部的页面要访问位于该区域之外的控制器时(例如共享布局页面或其他区域内的某个页面),则需要添加该控制器的区域。由于公共控制器不在特定区域中而是主项目的一部分,因此您必须将区域留空:

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

由于布局页面是在各个区域共享的,因此上述内容需要添加到所有动作和动作链接中。

与这里的问题完全相同: 具有共享布局的ASP.NET MVC区域

编辑:要清楚,这被标记为答案,因为它是我的问题的答案。上面的答案可能会解决触发相同错误的原因。


11
谢谢,对我有用。.NET发出的一条非常误导性的错误消息说,找不到该区域内动作的控制器,根本不是这种情况!
理查德·福塞特

1
这解决了我的问题。我想下一次我应该从绿色复选答案开始,而不是列表的顶部。
卡梅隆腰带

'@ Html.Action(“ About”,“ Home”,new {area =“”}))'将其指定为空白区域时会引发编译错误。有什么建议么 ?
Thamarai T

16

在我的情况下,相同的错误与Area没有关系,但被认为会发布在我的情况下引起的错误,这可能对那些通过搜索“找不到路径的控制器或未实现IController的线程”的人有所帮助”

该错误是由于_Layout.cshtml文件中的错误输入引起的。

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

具有该名称的捆绑包已在BundleConfig.cs中删除,但忘记了在_Layout.cshtml中将其删除

这很愚蠢,但是我们程序员总是会犯很多愚蠢的错误:)


1
感谢您的解决方案。确实有可能为看似相同但实际上只有一个相似的问题提供多种解决方案。但是,正如我的问题所指出的那样,我使用自己选择的解决方案仍然是最准确的。
reaper_unique 2014年

15

另外,对于那些上面的解决方案不起作用的人,这是对我有用的:

我有多个项目的解决方案。所有项目都在MVC3中。我在计算机上安装了Visual Studio 2012,似乎某些项目已自动升级到MVC4。

我有这个问题

找不到路径“ / etc / etc”的控制器或未实现IController

因为处理该路由的项目指向MVC4。

我必须手动更新其引用才能使用MVC3。您也可以通过使用文本编辑器打开.csproj文件来实现。找到对MVC3的引用并删除此行:

<SpecificVersion>False</SpecificVersion>

2
天啊。那是如此的随意和晦涩。非常感谢您的发布!:)未来读者:我的只是稍有不同-dll版本本身是4.0而不是3.0-不知道它是如何更改的。
杰瑞德(Jared)2014年

我的问题与此类似。我有一个表示层引用的共享库,其中包含一个共享控制器,该共享库使用的是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
这是我的错 谢谢乔治!
2015年

我有这个问题。这是因为我删除了HomeController.cs文件,但我不知道该文件是什么。
user2023861'1

您是首席执行官
Denys Wessels

12

就我而言,问题是控制器类尚未公开宣布。

class WorkPlaceController : Controller

解决方案是

public class WorkPlaceController : Controller

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

这是我的问题以及对我有用的解决方案。

我添加了一个新控制器,只需执行一个操作即可将字符串返回到现有应用程序。但是,当我通过浏览器导航到该控制器时,遇到了与上述相同的错误。

经过大量的搜索之后,我发现我只需要修改Global.asax.cs文件就可以识别新的控制器。我所做的只是在Global.asax.cs文件中添加了一个空格,以便对其进行修改并起作用


我们有3个生产网络服务器和5个开发/测试机器。仅在一台生产机器上它不起作用。添加空间并保存Global.asax可以修复该问题。#mindblown
jbwebtech

5

不知道这是否会从另一个角度解决问题,而不是接受的答案,但是我发现“区域”部分中的一个控制器位于错误的命名空间中。将名称空间更正为:

Areas.{AreaName}.Controller

为我解决了这个问题。

我怀疑关键因素是让给定区域内的所有控制器共享相同的名称空间。


希望您能喜欢答案,而不仅仅是问题。我已经无数次地无意中发现了这个答案。非常有用,谢谢。
Shelby115 '18

5

导致此错误的另一个原因:在可能打算使用Html.ActionLink的布局文件中意外使用Html.Action。如果Html.Action引用的视图使用相同的Layout文件,则实际上已经创建了一个无限循环。(布局视图将引用的视图加载为部分视图,然后加载布局视图,再加载引用的视图...)如果在Layout文件中设置断点并单步执行Htlm.Action,您有时会获得更多帮助有关堆栈大小过大的消息。


5

就我而言,我@{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }在_Layout.cshtml中,但是LayoutController不存在!(我从另一个解决方案复制了_Layout.cshtml,但忘记复制控制器了)


4

以global.asax / application_start方法为例,我在mvc路由之后注册了Web api路由,如下所示:

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

恢复订单解决了问题

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


2

令人尴尬的是,的问题是我在添加controller之后还没有重建代码

因此,可能要检查的第一件事是您的控制器已构建并且存在于二进制文件中(并公开存在)。如果您像我一样,它可以节省您几分钟的调试时间。


1
当然那是我的问题...总是让您感到愚蠢的事情。
TJ Wolschon '18

2

这可能是因为路径错误。因此,请首先检查控制器的路径和拼写。 在我的情况下,我的控制器名为CampsController,WebApiConfig.cs文件中包含一个额外的路径。

而不是:http:// localhost:6600 / Camps

它是:http:// localhost:6600 / api / Camps

我没有注意到WebApiConfig.cs文件中的api词:

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

在乔治的回答基础上,我发现我的控制器设置正确,ThingController并且在该控制器上定义了正确的方法Edit

但是..我认为是

<a href="https://stackoverflow.com/App/ThingController/Edit" />

我应该一直在使用没有单词控制器之类的名称的地方

<a href="https://stackoverflow.com/App/Thing/Edit" />


1

就我而言,我正在使用@ Html.Action(“ Menu”,“ Menu”)在_layout.cshtml文件中为我的菜单部分呈现另一种操作方法,而我忘记创建Menu控制器,并且由于当前使用的是布局文件控制器动作的视图,因此我在当前动作渲染请求中遇到此错误。如果您犯了相同的错误,请尝试查看布局以及查看文件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.