web-dev-qa-db-ja.com

パスのコントローラーが見つからなかったか、IControllerを実装していません

言語を選択できるMVC4プロジェクトがあります。

  • en
  • nl
  • fr

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はメイン部分にあるメニューをロードできないようです。

したがって、問題の根本は次のとおりです:プロジェクトのメイン部分(ホーム、共通、アバウトなど)のコントローラーへの領域(管理者など)へのアクセスを許可できますか?

72
reaper_unique

見つけました。

エリア内にあるページが、このエリア外にあるコントローラー(共有レイアウトページや別のエリア内の特定のページなど)にアクセスする場合、このコントローラーのエリアを追加する必要があります。共通コントローラは特定の領域ではなく、メインプロジェクトの一部であるため、領域を空のままにする必要があります。

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

レイアウトページはさまざまな領域で共有されるため、上記をすべてのアクションとアクションリンクに追加する必要があります。

こことまったく同じ問題です。 共有レイアウトのASP.NET MVCエリア

Edit:明確にするために、これは私の問題に対する答えだったので、答えとしてマークされています。上記の答えは、同じエラーを引き起こす原因を解決するかもしれません。

112
reaper_unique

私の場合、同じエラーはエリアに関連していませんでしたが、私の場合に発生したエラーを投稿すると考えられました。これは、「パスのコントローラが見つからないか、IControllerを実装していない」を検索することでこのスレッドに来る人々に役立つ可能性があります」

このエラーは、_Layout.cshtmlファイルのエントリが間違っているために発生しました。

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

その名前のバンドルはBundleConfig.csで削除されましたが、_Layout.cshtmlで削除するのを忘れていました

それはばかげていましたが、私たちプログラマーは常に多くのばかげた間違いをします:)

15
Tejasvi Hegde

また、上記のソリューションが機能しなかった人のために、ここに私のために働いたものがあります:

複数のプロジェクトを使用したソリューションがあります。すべてのプロジェクトはMVC3にありました。マシンにVisual Studio 2012をインストールしましたが、一部のプロジェクトはMVC4に自動的にアップグレードされたようです。

この問題が発生しました

パス '/ etc/etc'のコントローラーが見つからないか、IControllerを実装していません

そのルートを処理したプロジェクトがMVC4を指していたためです。

MVC3を使用するには、参照を手動で更新する必要がありました。また、テキストエディターで.csprojファイルを開くことでもできます。 MVC3への参照を見つけて、次の行を削除します。

<SpecificVersion>False</SpecificVersion>
14

このエラーは、コントローラーが(名前に)Word Controllerを持たなければならないという事実によっても発生します。 viz:HomeController;独自のControllerFactoryを実装しない限り。

12
George Stocker

私の場合、問題はコントローラークラスが公表されていないことでした。

class WorkPlaceController : Controller

解決策は

public class WorkPlaceController : Controller
12
SoaperPlus

このエラーのもう1つの考えられる根本的な原因は、エリア登録クラスの名前空間がコントローラーの名前空間と一致しない場合です。

例えば。コントローラクラスの正しい命名:

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

エリア登録クラスの名前が間違っている場合:

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

(上記のネームスペースはMySystem.Areas.Customersでなければなりません。)

コードのコピーと貼り付けを停止することを学ぶことはありますか?おそらくない。

11
Carl Sharman

これが私の問題と解決策です。

既存のアプリケーションに文字列を返す単一のアクションを持つ新しいコントローラーを追加しました。しかし、ブラウザーを介してそのコントローラーにナビゲートすると、上記と同じエラーが表示されました。

多くのグーグルを行った後、新しいコントローラーを認識するためにGlobal.asax.csファイルを変更するだけでよいことがわかりました。 Global.asax.csファイルにスペースを追加するだけで、変更されて機能しました。

6
armulator

私の場合、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" }
    );
}
6

私の場合、_Layout.cshtmlに@{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }がありましたが、LayoutControllerは存在しませんでした! (別のソリューションから_Layout.cshtmlをコピーしましたが、コントローラーをコピーするのを忘れていました)

5
Rush Frisby

これが受け入れられた答えとは異なる角度からソリューションにヒットするかどうかはわかりませんが、[エリア]セクションのコントローラーの1つが間違った名前空間に座っていることがわかりました。名前空間を次のように修正します。

Areas.{AreaName}.Controller

私のために問題を修正しました。

重要な要因は、特定の領域内のすべてのコントローラーが同じ名前空間を共有することだったと思います。

5
Richard Freeman

このエラーのもう1つの原因:Html.ActionLinkが意図されているレイアウトファイルでのHtml.Actionの偶発的な使用。 Html.Actionによって参照されるビューが同じレイアウトファイルを使用している場合、事実上無限ループが作成されています。 (レイアウトビューは、参照ビューを部分ビューとしてロードし、その後、参照ビューをロードするレイアウトビューをロードします...)過剰なスタックサイズに関するメッセージ。

設計に適切な場合は、コントローラークラスのアクセス修飾子が「パブリック」であることを確認できます。「内部」や「プライベート」などのアクセスを制限するものではありません。

2
Chris Halcrow

恥ずかしいことに、私の場合の問題は、コントローラーを追加した後、コードを再構築していないです。

したがって、最初に確認することは、コントローラーがビルドされ、バイナリーに存在する(そしてパブリックである)ことです。あなたが私のようなら、それはあなたのデバッグの数分を節約するかもしれません。

2
Tom Pažourek

Global.asax/application_startメソッドの場合、mvcルートの後にWeb APIルートを登録していました。

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

順序を元に戻すと問題が修正されました

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

別のシナリオで追加したいのは、私のシナリオでは、別のプロジェクトからコントローラーをコピーするのが間違っていたため、コントローラーの名前空間が異なりました。

1
LifeOfPi

この問題は、.csprojファイルにコンパイルプロセスのコントローラークラスを含めない場合にも発生します。

<Compile Include="YOUR_CONTROLLER_PATH.cs" />
1
Ismail Yilmaz

レガシーアプリケーションの場合、web.configファイルのノード<system.webServer>の下にエントリを追加すると問題が発生しました

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

削除すると、問題は解決しました。

1

私の場合、コントローラーが誤った名前だったためです。 LayoutControllerを呼び出しましたが、代わりにLayoutを呼び出す必要があります。

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "LayoutController" })</a>

する必要があります:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "Layout")</a>
1
live-love

これに基づいて answer によって、私の場合、コントローラーをThingControllerとして適切に設定し、そのコントローラーで適切に定義されたメソッドEditを見つけました。

しかし..私は私のビューでそれを参照していました

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

Wordコントローラーなしで名前を使用していたはずの場所

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

0
MysticVagabond