81

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

  • ja
  • nl
  • フランス

1 つのメイン パーツ:

  • 共通(メニュー用)
  • コンタクト
  • よくある質問

そして3つの分野:

  • 管理者
  • お客様

各領域には、少なくとも 1 つのコントローラーがあります。たとえば、管理者には、コントローラーの概要と、 index.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 はメイン部分にあるメニューを読み込めないようです。

したがって、問題の根本は次のとおりです。プロジェクトの主要部分 (ホーム、コモン、アバウトなど) のコントローラーへのアクセス権を領域 (管理者など) に付与できますか?

4

24 に答える 24

126

私はそれを見つけました。

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

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

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

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

編集:明確にするために、これは私の問題の答えだったので、答えとしてマークされています。上記の回答は、同じエラーを引き起こす原因を解決する可能性があります。

于 2012-12-23T14:05:31.493 に答える
15

また、上記の解決策がうまくいかなかった人のために、これが私にとってうまくいったものです:

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

この問題が発生しました

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

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

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

<SpecificVersion>False</SpecificVersion>
于 2013-11-01T15:24:21.873 に答える
13

Controllerこのエラーは、コントローラーの名前に;という単語が含まれている必要があるという事実によっても発生する可能性があります。つまり: HomeController; 独自の を実装しない限りControllerFactory

于 2015-01-27T21:26:03.450 に答える
13

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

class WorkPlaceController : Controller

解決策は

public class WorkPlaceController : Controller
于 2015-05-22T15:21:32.413 に答える
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" }
    );
}
于 2016-06-03T15:45:57.150 に答える
7

これが私の問題と、私にとってうまくいった解決策です。

既存のアプリケーションに文字列を返す単一のアクションを持つ新しいコントローラーを追加しました。しかし、ブラウザー経由でそのコントローラーに移動すると、上記と同じエラーが発生しました。

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

于 2013-11-07T15:37:52.807 に答える
5

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

于 2016-01-06T19:28:55.617 に答える
4

これは、パスが間違っていたことが原因である可能性があります。そのため、最初にコントローラーのパスとスペルを確認してください。 私の場合、コントローラーの名前は 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)
于 2019-07-03T16:40:07.317 に答える
1

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

于 2016-02-18T07:11:00.290 に答える