【问题标题】:The controller for path was not found or does not implement IController找不到路径的控制器或未实现 IController
【发布时间】:2012-12-10 06:24:00
【问题描述】:

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

  • zh
  • nl
  • 法国

1 个主要部分:

  • 关于
  • 通用(用于菜单)
  • 联系方式
  • 常见问题解答
  • 首页

还有3个方面:

  • 管理员
  • 客户
  • 商店

在每个区域中,我至少有一个控制器,例如在管理中,我有控制器 overview 和相应的视图文件夹 overview,其中包含一个 index.html。 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 部分的菜单。

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

【问题讨论】:

  • 您是否尝试过注释掉对 Html.Action 的调用以将问题隔离到特定控制器?
  • 我还没有,但现在我做到了,而且和我想的一样。区域 Admin 使用我项目主要部分的布局,当它到达 Action 时,该区域尝试访问不在引发错误的区域中的控制器。换句话说,问题的根源是,我怎样才能在我的项目的主要部分(home、common、about 等控制器)中授予对控制器的区域访问权限?
  • 问题是越来越多的可能的问题和解决方案。因此,我认为,必须同时查看其他答案,而不是唯一被接受的答案。

标签: c# asp.net-mvc-4 asp.net-mvc-areas


【解决方案1】:

我找到了。

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

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

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

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

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

【讨论】:

  • 谢谢,这对我有用。这是来自 .NET 的一条非常具有误导性的错误消息,说找不到该区域内的操作的控制器,而事实并非如此!
  • 这解决了我的问题。我想下次我应该从绿色检查答案开始,而不是从列表顶部开始。
  • '@Html.Action("About", "Home", new { area = "" })' 将其指定为空白区域时会引发编译错误。有什么建议吗?
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 感谢您的解决方案。对于一个看似相同但实际上只有一个相似的问题,确实有可能有多种解决方案。但是,正如我的问题所述,我使用的区域我自己选择的解决方案仍然是最准确的。
【解决方案3】:

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

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

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

区域注册类命名不正确:

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

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

我会学会停止复制和粘贴代码吗?应该不会吧。

【讨论】:

  • 这让我很吃惊并且很难找到,因为命名空间在根控制器文件夹中时是错误的(从另一个项目复制的代码),但在我将它移动到地区。
【解决方案4】:

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

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

我遇到了这个问题

路径 '/etc/etc' 的控制器未找到或未实现 IController

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

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

<SpecificVersion>False</SpecificVersion>

【讨论】:

  • 天哪。这是如此随机和晦涩。非常感谢发帖! :) 未来的读者:我的只是略有不同 - dll 版本本身是 4.0 而不是 3.0 - 不知道它是如何改变的。
  • 我的问题类似;我有一个共享库,它被表示层引用并包含一个共享控制器,共享库使用 mvc4,而表示层使用 mvc3。一旦我将共享库更新到 MVC3,它就解决了这个问题。
【解决方案5】:

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

【讨论】:

  • 这是我的错误。谢谢乔治!
  • 我遇到了这个问题。那是因为我删除了我的 HomeController.cs 文件,我不明白它依赖什么。
  • 你是CEO
【解决方案6】:

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

class WorkPlaceController : Controller

解决办法是

public class WorkPlaceController : Controller

【讨论】:

    【解决方案7】:

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

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

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

    【讨论】:

    • 我们有 3 台生产网络服务器和 5 台开发/测试机器。只有在一台生产机器上它不工作。添加空间并保存 Global.asax 修复了它。 #头脑风暴
    【解决方案8】:

    在我的情况下,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" }
        );
    }
    

    【讨论】:

      【解决方案9】:

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

      Areas.{AreaName}.Controller
      

      为我解决了这个问题。

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

      【讨论】:

      • 希望您能最喜欢的答案,而不仅仅是问题。我已经多次偶然发现这个答案。太有帮助了,谢谢。
      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

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

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

          恢复订单解决了问题

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

          【讨论】:

            【解决方案13】:

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

            【讨论】:

              【解决方案14】:

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

              【讨论】:

                【解决方案15】:

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

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

                【讨论】:

                • 当然那是我的问题...总是愚蠢的事情让你着迷。
                【解决方案16】:

                在 George 的 answer 的基础上,我发现我已将控制器正确设置为 ThingController,并且在该控制器 Edit 上有正确定义的方法。

                但是..我在我的视图中引用它

                &lt;a href="/App/ThingController/Edit" /&gt;

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

                &lt;a href="/App/Thing/Edit" /&gt;

                【讨论】:

                  【解决方案17】:

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

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

                  【讨论】:

                    【解决方案18】:

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

                    【讨论】:

                      【解决方案19】:

                      在我的遗留应用程序的情况下,当我在节点 &lt;system.webServer&gt; 下的 web.config 文件中添加以下条目时出现问题

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

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

                      【讨论】:

                        【解决方案20】:

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

                        <Compile Include="YOUR_CONTROLLER_PATH.cs" />
                        

                        【讨论】:

                          【解决方案21】:

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

                          【讨论】:

                            【解决方案22】:

                            有人将此添加到视图中。

                            @Scripts.Render("~/bundles/jqueryval")
                            

                            然后他们将BundleConfig.cs 文件添加到App_Start 文件夹中。
                            RegisterBundles 方法中他们有:

                            bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js"));
                            

                            但是,他们忘记在 Global.asax.cs 文件中完成连接。
                            要修复,我所要做的就是将此添加到 Global.asax.cs 中的 Application_Start 方法中:

                            RouteConfig.RegisterRoutes(RouteTable.Routes);
                            

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

                            【讨论】:

                              【解决方案23】:

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

                              【讨论】:

                                【解决方案24】:

                                对我来说,我正在运行 IIS Express https://localhost:1234/pg/Abc/Page 但是在 IIS 中注册网络,例如 https://localhost:1234/Abc/Page 因此,在调用网页时,我使用 /pg/ 调用第一个链接,这会引发 Not Found Exception。

                                【讨论】:

                                  猜你喜欢
                                  • 2013-05-31
                                  • 1970-01-01
                                  • 2016-11-26
                                  • 1970-01-01
                                  • 2020-07-20
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多