我有一个语言选择的MVC4项目:
1个主要部分:
以及3个方面:
在每个区域,我至少有一个控制器,例如在管理员中我有控制器概述,其中包含索引的相应视图文件夹概述。 aspx 页面。
主页和所有主要页面(about,faq等)都可以访问。
但是,当我按照url:localhost:xxxx / en / admin / overview时 我收到了错误
未找到路径'/ en / admin / overview'的控制器或未实现IController。
即使路线正确(我可以通过Route Debugger看到)。错误页面还显示当我想加载主菜单项时抛出错误:
<nav id="site-navigation" class="eightcol">
@Html.Action("MenuItems", "Common")
</nav>
- 代码已移除,因为无关紧要 -
似乎一切都井然有序,但MVC似乎无法加载位于主要部分的菜单。
因此,问题的根源是: 我可以授予区域(例如管理员)访问我项目主要部分(家庭,普通,关于等)中的控制器的权限吗?
答案 0 :(得分:109)
我找到了。
当位于某个区域内的页面想要访问位于该区域之外的控制器(例如共享布局页面或不同区域内的某个页面)时,该控制器的区域需要加上。 由于公共控制器不在特定区域而是主项目的一部分,因此您必须将区域留空:
@Html.Action("MenuItems", "Common", new {area="" })
由于布局页面在各个区域共享,因此上述内容需要添加到所有操作和操作链接中。
这与此处的问题完全相同: ASP.NET MVC Areas with shared layout
修改:要清楚,这标记为答案,因为它是我的问题的答案。上述答案可能会解决触发相同错误的原因。
答案 1 :(得分:15)
在我的情况下,同样的错误与Area没有关系,但是考虑发布在我的情况下引起的错误,这可能对通过搜索“找不到路径的控制器来到此线程的人有帮助”没有实现IController“
错误是由于_Layout.cshtml文件中输入错误引起的。
@Styles.Render("~/Content/misc")
在BundleConfig.cs中删除了具有该名称的包但忘记在_Layout.cshtml中删除它
这很愚蠢,但我们程序员总是犯很多愚蠢的错误:)
答案 2 :(得分:14)
此外,对于那些上述解决方案不起作用的人来说,这对我有用:
我有一个包含多个项目的解决方案。所有项目都在MVC3中。我在我的机器上安装了Visual Studio 2012,似乎有些项目自动升级到MVC4。
我遇到了这个问题
未找到路径'/ etc / etc'的控制器或未实现IController
因为处理该路由的项目指向MVC4。
我不得不手动更新他们的引用以使用MVC3。您也可以通过使用文本编辑器打开.csproj文件来完成此操作。找到对MVC3的引用并删除此行:
<SpecificVersion>False</SpecificVersion>
答案 3 :(得分:12)
这个错误也可能是因为控制器必须(在他们的名字中)有单词Controller
;即:HomeController
;除非您实施自己的ControllerFactory
。
答案 4 :(得分:12)
就我而言,问题是控制器类尚未公开宣布。
class WorkPlaceController : Controller
解决方案是
public class WorkPlaceController : Controller
答案 5 :(得分:11)
此错误的另一个可能的根本原因是区域注册类的命名空间与控制器的命名空间不匹配。
E.g。在控制器类上正确命名:
namespace MySystem.Areas.Customers
{
public class CustomersController : Controller
{
...
}
}
区域注册类的命名不正确:
namespace MySystem.Areas.Shop
{
public class CustomersAreaRegistration : AreaRegistration
{
...
}
}
(上面的命名空间应为MySystem.Areas.Customers
。)
我是否会学会停止复制和粘贴代码?可能不是。
答案 6 :(得分:6)
这是我的问题和解决方案,它对我有用。
我添加了一个新控制器,其中一个操作将字符串返回给现有应用程序。但是当我通过浏览器导航到该控制器时,我得到了与上面提到的相同的错误。
经过大量的谷歌搜索,我发现我只需要修改我的Global.asax.cs文件,以便识别新的控制器。我所做的只是在Global.asax.cs文件中添加了一个空格,以便对其进行修改并运行
答案 7 :(得分:6)
在我的情况下,<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckedTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/checkedTextView"
android:gravity="center"
android:drawableLeft="?android:attr/listChoiceIndicatorMultiple"
android:checkMark="@color/accent_material_light"/>
</LinearLayout>
参数与控制器的命名空间不匹配。
namespaces
答案 8 :(得分:5)
不确定这是否会从与接受的答案不同的角度来解决问题,但我发现Area部分中的一个控制器位于错误的命名空间中。将名称空间更正为:
Areas.{AreaName}.Controller
为我解决了这个问题。
我怀疑关键因素是让给定区域内的所有控制器共享相同的命名空间。
答案 9 :(得分:5)
在我的情况下,我在_Layout.cshtml中有@{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }
但是LayoutController不存在! (我从另一个解决方案中复制了_Layout.cshtml但忘了复制控制器)
答案 10 :(得分:4)
此错误的另一个原因:在布局文件中意外使用Html.Action,其中可能是Html.ActionLink。如果Html.Action引用的视图使用相同的Layout文件,则实际上创建了无限循环。 (布局视图将引用的视图作为局部视图加载,然后加载加载引用视图的布局视图...)如果在布局文件中设置断点并单步执行Htlm.Action,有时会获得更多帮助关于堆栈大小过多的消息。
答案 11 :(得分:2)
我希望这对其他人有帮助。我遇到了这个问题,因为虽然我正确命名了控制器,但文件中的类中有一个拼写错误。我正在寻找 OrderSearch,文件是 OrderSearchController.cs,但类是 OrdersSearchController。
显然,它们应该匹配,但它们不必匹配,并且您的路由针对的是类,而不是文件名。
答案 12 :(得分:2)
令人尴尬的是,我的问题是在添加控制器后我没有重建代码。
因此,首先要检查的是你的控制器是在二进制文件中构建并存在的(并且是公共的)。如果您喜欢我,可能会为您节省几分钟的调试时间。
答案 13 :(得分:1)
对我来说,我运行的是 IIS Express https://localhost:1234/pg/Abc/Page 但是在 IIS 中注册 web,如 https://localhost:1234/Abc/Page 因此,在调用网页时,我使用 /pg/ 调用了第一个链接,该链接抛出了 Not Found 异常。
答案 14 :(得分:1)
或者您可能在控制器名称末尾遗漏了关键字“Controller”;)
答案 15 :(得分:1)
在我的情况下,我正在使用@ Html.Action(“ Menu”,“ Menu”)在_layout.cshtml文件中为我的菜单部分呈现另一种操作方法,而我却忘记了创建Menu控制器并且正在使用布局文件因此,在当前控制器动作视图中,我在当前动作渲染请求中遇到此错误。如果您犯了同样的错误,请尝试查看布局并查看文件
答案 16 :(得分:1)
如果您没有在.csproj文件中包括用于编译过程的控制器类,也会发生此问题。
<Compile Include="YOUR_CONTROLLER_PATH.cs" />
答案 17 :(得分:1)
在我的遗留应用程序的情况下,当我在节点<system.webServer>
<modules runAllManagedModulesForAllRequests="true"></modules>
当我删除它时,问题已解决。
答案 18 :(得分:1)
如果适合您的设计,您可以确保控制器类上的访问修饰符是“公开”的,而不是可以限制“内部”或“私有”访问的内容。
答案 19 :(得分:1)
在另一个场景中,我想添加的是在我的场景中,控制器的名称空间不同,因为从另一个项目复制控制器是错误的。
答案 20 :(得分:0)
在George的answer的基础上,我发现我已将控制器正确设置为ThingController
,并且在该控制器Edit
上有正确定义的方法。 / p>
但是。.我在我的观点中引用它
<a href="/App/ThingController/Edit" />
我应该只使用名称而不使用单词controller之类的
<a href="/App/Thing/Edit" />
答案 21 :(得分:0)
就我而言,在global.asax / application_start方法中, 我在MVC路由之后注册了Web api路由,如下所示:
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
恢复订单已解决问题
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
答案 22 :(得分:0)
在我的情况下,这是因为控制器的名称名称错误。我叫LayoutController,但应该叫Layout:
<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "LayoutController" })</a>
应为:
<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "Layout")</a>
答案 23 :(得分:0)
有人将其添加到视图中。
@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
之后。