81

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

  • zh
  • 荷兰语
  • 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 似乎无法加载位于 main 部分的菜单。

所以,问题的根源是:我可以授予一个区域(例如管理员)访问我项目主要部分(家庭、公共、关于等)的控制器吗?

4

24 回答 24

126

我已经找到了。

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

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

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

这与这里的问题完全相同: ASP.NET MVC Areas with shared layout

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

于 2012-12-23T14:05:31.493 回答
17

在我的情况下,相同的错误与 Area 无关,但考虑发布在我的情况下引起的错误,这可能对通过搜索“找不到路径的控制器或未实现 IController”来访问此线程的人有所帮助"

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

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

在 BundleConfig.cs 中删除了具有该名称的包,但忘记在 _Layout.cshtml 中删除它

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

于 2014-02-13T12:25:35.833 回答
16

此错误的另一个可能根本原因是区域注册类的名称空间与控制器的名称空间不匹配。

例如控制器类的正确命名:

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

区域注册类命名不正确:

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

(上面的命名空间应该是MySystem.Areas.Customers。)

我会学会停止复制和粘贴代码吗?可能不是。

于 2015-12-02T16:05:46.283 回答
15

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

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

我遇到了这个问题

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

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

我不得不手动更新他们的引用以使用 MVC3。您也可以通过使用文本编辑器打开 .csproj 文件来做到这一点。找到对 MVC3 的引用并删除此行:

<SpecificVersion>False</SpecificVersion>
于 2013-11-01T15:24:21.873 回答
13

这个错误也可能是由于控制器必须有(在他们的名字中)这个词Controller;即:HomeController; 除非您实现自己的ControllerFactory.

于 2015-01-27T21:26:03.450 回答
13

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

class WorkPlaceController : Controller

解决方案是

public class WorkPlaceController : Controller
于 2015-05-22T15:21:32.413 回答
7

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

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

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

于 2013-11-07T15:37:52.807 回答
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" }
    );
}
于 2016-06-03T15:45:57.150 回答
6

不确定这是否会从与接受的答案不同的角度来解决解决方案,但我发现我在“区域”部分中的一个控制器位于错误的命名空间中。将命名空间更正为:

Areas.{AreaName}.Controller

为我解决了这个问题。

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

于 2015-02-18T07:22:20.543 回答
5

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

于 2015-12-14T02:19:14.953 回答
5

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

于 2016-01-06T19:28:55.617 回答
5

在我的 global.asax/application_start 方法中,我在 mvc 路由之后注册 web api 路由,如下所示:

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

恢复订单解决了问题

GlobalConfiguration.Configure(WebApiConfig.Register);            
RouteConfig.RegisterRoutes(RouteTable.Routes);
于 2019-01-30T08:06:12.560 回答
4

这可能是因为路径错误。所以先检查控制器的路径和拼写。 在我的例子中,我的控制器被命名为 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>

另一个示例,可能是因为您定义了错误的 Route 路径。确保您的路径正确。例子:

   [RoutePrefix("api/camps")]
   public class CampsController : ApiController

   [Route("{moniker}")]
   public async Task<IHttpActionResult> Get(string moniker)
于 2019-07-03T16:40:07.317 回答
3

如果适合您的设计,您可以确保控制器类上的访问修饰符是“公共的”,而不是像“内部”或“私有”这样可能限制访问的东西。

于 2016-06-21T07:07:39.283 回答
2

尴尬的是,我的问题是添加控制器后我没有重新构建代码

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

于 2017-03-01T11:25:02.747 回答
2

基于 George 的这个答案,我发现我已经正确设置了我的控制器,ThingController并且我在该控制器上有一个正确定义的方法Edit

但是..我在我看来是在引用它

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

我应该只使用名称而没有像控制器这样的单词

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

于 2018-09-18T09:26:13.073 回答
2

我希望这对其他人有帮助。我遇到了这个问题,因为虽然我正确命名了控制器,但文件中的类中有一个错字。我在寻找 OrderSearch,文件是 OrderSearchController.cs,但类是 OrdersSearchController。

显然,它们应该匹配,但它们不必匹配,并且您的路由针对的是类,而不是文件名。

于 2021-01-06T19:23:52.443 回答
1

在另一个场景中,我想添加的是在我的场景中,控制器的名称空间不同,因为它是从另一个项目复制控制器的错误。

于 2016-02-18T07:11:00.290 回答
1

在我的遗留应用程序的情况下,当我在节点下的 web.config 文件中添加以下条目时发生了问题<system.webServer>

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

当我删除它时,问题解决了。

于 2017-12-19T13:56:07.547 回答
1

如果您没有在 .csproj 文件中包含用于编译过程的控制器类,也会出现此问题。

<Compile Include="YOUR_CONTROLLER_PATH.cs" />
于 2018-07-13T13:05:12.650 回答
1

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

于 2019-09-18T11:02:58.180 回答
1

有人将此添加到视图中。

@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

RouteConfig.RegisterRoutes(RouteTable.Routes);

注意:我认为这条线在Application_Start方法中的排序/放置很重要,
所以请记住这一点。
我在之后立即放置了我ViewEngines的。

于 2020-12-17T15:47:10.373 回答
1

或者您可能在控制器名称末尾错过了关键字“Controller”;)

于 2020-12-19T09:03:16.413 回答
1

对我来说,我正在运行 IIS Express https://localhost:1234/pg/Abc/Page 但是在 IIS 中注册网络,例如 https://localhost:1234/Abc/Page 所以在调用网页时我调用的是第一个与抛出 Not Found Exception 的 /pg/ 链接。

于 2021-06-02T20:49:17.833 回答