言語を選択できるMVC4プロジェクトがあります。
1つの主要部分:
そして3つのエリア:
各エリアには、少なくとも1つのコントローラーがあります。たとえば、管理者には、対応するビューフォルダーoverviewを持つコントローラーoverviewがありますindex.aspxページが含まれています。
ホームページとすべてのメインページ(about、faqなど)が機能し、アクセスできます)。
ただし、次のURLを実行すると、localhost:xxxx/en/admin/overviewというエラーが表示されます。
パス '/ en/admin/overview'のコントローラーが見つからないか、IControllerを実装していません。
ルートが正しい場合でも(ルートデバッガーでこれを確認できます)、エラーページには、メインメニュー項目をロードしようとしたときにエラーがスローされたことが示されています。
<nav id="site-navigation" class="eightcol">
@Html.Action("MenuItems", "Common")
</nav>
-関連性がないためコードを削除-
すべてが正常に動作しているように見えますが、MVCはメイン部分にあるメニューをロードできないようです。
したがって、問題の根本は次のとおりです:プロジェクトのメイン部分(ホーム、共通、アバウトなど)のコントローラーへの領域(管理者など)へのアクセスを許可できますか?
見つけました。
エリア内にあるページが、このエリア外にあるコントローラー(共有レイアウトページや別のエリア内の特定のページなど)にアクセスする場合、このコントローラーのエリアを追加する必要があります。共通コントローラは特定の領域ではなく、メインプロジェクトの一部であるため、領域を空のままにする必要があります。
@Html.Action("MenuItems", "Common", new {area="" })
レイアウトページはさまざまな領域で共有されるため、上記をすべてのアクションとアクションリンクに追加する必要があります。
こことまったく同じ問題です。 共有レイアウトのASP.NET MVCエリア
Edit:明確にするために、これは私の問題に対する答えだったので、答えとしてマークされています。上記の答えは、同じエラーを引き起こす原因を解決するかもしれません。
私の場合、同じエラーはエリアに関連していませんでしたが、私の場合に発生したエラーを投稿すると考えられました。これは、「パスのコントローラが見つからないか、IControllerを実装していない」を検索することでこのスレッドに来る人々に役立つ可能性があります」
このエラーは、_Layout.cshtmlファイルのエントリが間違っているために発生しました。
@Styles.Render("~/Content/misc")
その名前のバンドルはBundleConfig.csで削除されましたが、_Layout.cshtmlで削除するのを忘れていました
それはばかげていましたが、私たちプログラマーは常に多くのばかげた間違いをします:)
また、上記のソリューションが機能しなかった人のために、ここに私のために働いたものがあります:
複数のプロジェクトを使用したソリューションがあります。すべてのプロジェクトはMVC3にありました。マシンにVisual Studio 2012をインストールしましたが、一部のプロジェクトはMVC4に自動的にアップグレードされたようです。
この問題が発生しました
パス '/ etc/etc'のコントローラーが見つからないか、IControllerを実装していません
そのルートを処理したプロジェクトがMVC4を指していたためです。
MVC3を使用するには、参照を手動で更新する必要がありました。また、テキストエディターで.csprojファイルを開くことでもできます。 MVC3への参照を見つけて、次の行を削除します。
<SpecificVersion>False</SpecificVersion>
このエラーは、コントローラーが(名前に)Word Controller
を持たなければならないという事実によっても発生します。 viz:HomeController
;独自のControllerFactory
を実装しない限り。
私の場合、問題はコントローラークラスが公表されていないことでした。
class WorkPlaceController : Controller
解決策は
public class WorkPlaceController : Controller
このエラーのもう1つの考えられる根本的な原因は、エリア登録クラスの名前空間がコントローラーの名前空間と一致しない場合です。
例えば。コントローラクラスの正しい命名:
namespace MySystem.Areas.Customers
{
public class CustomersController : Controller
{
...
}
}
エリア登録クラスの名前が間違っている場合:
namespace MySystem.Areas.Shop
{
public class CustomersAreaRegistration : AreaRegistration
{
...
}
}
(上記のネームスペースはMySystem.Areas.Customers
でなければなりません。)
コードのコピーと貼り付けを停止することを学ぶことはありますか?おそらくない。
これが私の問題と解決策です。
既存のアプリケーションに文字列を返す単一のアクションを持つ新しいコントローラーを追加しました。しかし、ブラウザーを介してそのコントローラーにナビゲートすると、上記と同じエラーが表示されました。
多くのグーグルを行った後、新しいコントローラーを認識するためにGlobal.asax.csファイルを変更するだけでよいことがわかりました。 Global.asax.csファイルにスペースを追加するだけで、変更されて機能しました。
私の場合、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" }
);
}
私の場合、_Layout.cshtmlに@{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }
がありましたが、LayoutControllerは存在しませんでした! (別のソリューションから_Layout.cshtmlをコピーしましたが、コントローラーをコピーするのを忘れていました)
これが受け入れられた答えとは異なる角度からソリューションにヒットするかどうかはわかりませんが、[エリア]セクションのコントローラーの1つが間違った名前空間に座っていることがわかりました。名前空間を次のように修正します。
Areas.{AreaName}.Controller
私のために問題を修正しました。
重要な要因は、特定の領域内のすべてのコントローラーが同じ名前空間を共有することだったと思います。
このエラーのもう1つの原因:Html.ActionLinkが意図されているレイアウトファイルでのHtml.Actionの偶発的な使用。 Html.Actionによって参照されるビューが同じレイアウトファイルを使用している場合、事実上無限ループが作成されています。 (レイアウトビューは、参照ビューを部分ビューとしてロードし、その後、参照ビューをロードするレイアウトビューをロードします...)過剰なスタックサイズに関するメッセージ。
設計に適切な場合は、コントローラークラスのアクセス修飾子が「パブリック」であることを確認できます。「内部」や「プライベート」などのアクセスを制限するものではありません。
恥ずかしいことに、私の場合の問題は、コントローラーを追加した後、コードを再構築していないです。
したがって、最初に確認することは、コントローラーがビルドされ、バイナリーに存在する(そしてパブリックである)ことです。あなたが私のようなら、それはあなたのデバッグの数分を節約するかもしれません。
Global.asax/application_startメソッドの場合、mvcルートの後にWeb APIルートを登録していました。
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
順序を元に戻すと問題が修正されました
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
別のシナリオで追加したいのは、私のシナリオでは、別のプロジェクトからコントローラーをコピーするのが間違っていたため、コントローラーの名前空間が異なりました。
この問題は、.csprojファイルにコンパイルプロセスのコントローラークラスを含めない場合にも発生します。
<Compile Include="YOUR_CONTROLLER_PATH.cs" />
レガシーアプリケーションの場合、web.configファイルのノード<system.webServer>
の下にエントリを追加すると問題が発生しました
<modules runAllManagedModulesForAllRequests="true"></modules>
削除すると、問題は解決しました。
私の場合、コントローラーが誤った名前だったためです。 LayoutControllerを呼び出しましたが、代わりにLayoutを呼び出す必要があります。
<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "LayoutController" })</a>
する必要があります:
<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "Layout")</a>
これに基づいて answer によって、私の場合、コントローラーをThingController
として適切に設定し、そのコントローラーで適切に定義されたメソッドEdit
を見つけました。
しかし..私は私のビューでそれを参照していました
<a href="/App/ThingController/Edit" />
Wordコントローラーなしで名前を使用していたはずの場所
<a href="/App/Thing/Edit" />