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

rea*_*que 72 c# asp.net-mvc-areas asp.net-mvc-4

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

  • NL
  • 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>
Run Code Online (Sandbox Code Playgroud)

- 删除了代码,因为无关紧要 -

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

因此,问题的根源是:我可以授予一个区域(例如Admin)访问我项目主要部分(home,common,about等)中的控制器吗?

rea*_*que 114

我找到了.

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

@Html.Action("MenuItems", "Common", new {area="" }) 
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 谢谢,这对我有用.这是来自.NET的一个非常误导性的错误消息,说无法找到该区域内的操作的控制器,这根本不是这种情况! (9认同)
  • 这解决了我的问题。我想下次我应该从绿色复选答案开始,而不是从列表的顶部开始。 (2认同)

Tej*_*gde 15

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

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

@Styles.Render("~/Content/misc")
Run Code Online (Sandbox Code Playgroud)

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

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


Car*_*z T 14

此外,对于那些上述解决方案不起作用的人来说,这对我有用:

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

我遇到了这个问题

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

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

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

<SpecificVersion>False</SpecificVersion>
Run Code Online (Sandbox Code Playgroud)

  • 天啊.这是如此随机和模糊.非常感谢发布!:)未来的读者:我只是略有不同 - DLL版本本身是4.0而不是3.0 - 不知道它是如何改变的. (2认同)

Geo*_*ker 12

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

  • 这是我的错.谢谢乔治! (2认同)

Soa*_*lus 12

在我的情况下,问题是控制器类尚未公开宣布.

class WorkPlaceController : Controller
Run Code Online (Sandbox Code Playgroud)

解决方案是

public class WorkPlaceController : Controller
Run Code Online (Sandbox Code Playgroud)


Car*_*man 12

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

例如,在控制器类上正确命名:

namespace MySystem.Areas.Customers
{
    public class CustomersController : Controller
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

区域注册类的命名不正确:

namespace MySystem.Areas.Shop
{
    public class CustomersAreaRegistration : AreaRegistration
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这让我感到困惑,很难找到它,因为名称空间在根控制器文件夹(从另一个项目复制的代码)中时是错误的,但是在我将其移至某个区域之前没关系。 (2认同)

Ale*_*kov 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" }
    );
}
Run Code Online (Sandbox Code Playgroud)


arm*_*tor 6

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

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

经过大量的谷歌搜索,我发现我只需要修改我的Global.asax.cs文件,以便识别新的控制器.我所做的只是为Global.asax.cs文件添加了一个空格,以便它被修改并且有效


Ric*_*man 5

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

Areas.{AreaName}.Controller
Run Code Online (Sandbox Code Playgroud)

为我解决了这个问题.

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


Mik*_*MVP 5

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


Rus*_*sby 5

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


Ege*_*coz 5

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

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
Run Code Online (Sandbox Code Playgroud)

恢复订单解决了问题

GlobalConfiguration.Configure(WebApiConfig.Register);            
RouteConfig.RegisterRoutes(RouteTable.Routes);
Run Code Online (Sandbox Code Playgroud)