web-dev-qa-db-ja.com

ASP.NETMVCエリアルーティングでエラー404が見つかりません

MVC 5のエリアルートに問題があります。/Evernote/EvernoteAuthを参照すると、404リソースが見つかりませんというエラーが表示されます。

私のエリアは次のようになります。

Areas
    Evernote
        Controllers
            EvernoteAuthController
        Views
            EvernoteAuth
                Index.cshtml

EvernoteAreaRegistration.cs(更新:RegisterArea()が呼び出されていなかったため、クリーンアンドリビルドを実行しました。呼び出されましたが、同じ結果になりました。)には次のルートマップが含まれています。

public override void RegisterArea(AreaRegistrationContext context)
{
     context.MapRoute(
        "Evernote_default",
        "Evernote/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
     );
}

EvernoteAuthControllerのIndex()メソッドは単にView()を返します。

私のアプリケーションのRouteConfig.csには現在ルートマップが定義されていませんが、これを実装して手動で「強制」してみました。

routes.MapRoute(
    name: "EvernoteAuthorization",
    url: "Evernote/{controller}/{action}",
    defaults: new { controller = "EvernoteAuth", action = "Index", id = UrlParameter.Optional },
    namespaces: new string[] { "AysncOAuth.Evernote.Simple.SampleMVC.Controllers" }
);

しかし、このルートマップが存在するかコメントアウトされているかにかかわらず、同じ結果が得られます。

Phil Haackの asp.net mvcルーティングデバッガー を使用すると、ルートが正常に一致し、エリア名、コントローラー名、およびアクションメソッド名が一致することがわかりました。コントローラのアクションメソッドにブレークポイントを設定しましたが、それらのメソッドは入力されませんでした。更新:/ Evernote/EvernoteAuthを参照するときにこれらのメソッドが入力されることはありませんでしたが、エリア名/ Evernoteのみを参照すると、EvernoteAuthControllerがインスタンス化され、Index()メソッドが呼び出されました。 (そのコントローラーが/ Evernote/EvernoteAuthではなく/ Evernoteによってインスタンス化されるのはなぜですか?)次に、エラーが発生しました:

The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/EvernoteAuth/Index.aspx
~/Views/EvernoteAuth/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/EvernoteAuth/Index.cshtml
~/Views/Shared/Index.cshtml
and so on...

この場合、私は〜= /(アプリケーションルート)と信じています。したがって、エリアAreas\Evernote\Viewsは検索されていません。

これをトラブルシューティングするにはどうすればよいですか?

9
Howiecamp

コントローラに正しい名前空間を追加することが重要です

  namespace YourDefaultNamespace.Areas.Evernote.Controllers
  {
    public class EvernoteAuthController : Controller
    { 
        ...
        ...
    }
  }

したがって、ルーティングはコントローラーを見つけることができます。次に、Global.asax.csの領域をメソッドで登録する必要があります

AreaRegistration.RegisterAllAreas();
22
DavideDM

_Application_Start_メソッド内のAreaRegistration.RegisterAllAreas();に注意してください。

AreaRegistration.RegisterAllAreas()を_Application_Start_内の最後に置くと、機能しません。

AreaRegistration.RegisterAllAreas()を最初にすると、ルーティングが正常に実行されます。

例:

_ protected void Application_Start(object sender, EventArgs e)
 {
        AreaRegistration.RegisterAllAreas();  //<--- Here work

        FilterConfig.Configure(GlobalFilters.Filters);
        RouteConfig.Configure(RouteTable.Routes);

        AreaRegistration.RegisterAllAreas();  //<--- Here not work
 }
_
3
Ivan

http://legacy.piranhacms.org/the-magic-of-mvc-routing-with-multiple-areas の私の投稿で見つけたように、おそらくallコントローラーは、デフォルトルート(つまり、ルート構成で手動で追加したルート)にマップされます。デフォルトルートに追加されている場合は、ビューのデフォルトルートの場所を検索します。つまり、~/Views/...

したがって、エラーは実際にはAreaが正しく構成されていないことのようです。 Global.asax.xsに次の行があることを確認してください。

AreaRegistration.RegisterAllAreas();

これは実際にエリアを設定する行であり、エリア内のコントローラーがヒットしたときに、そのエリアのビューディレクトリが検索されるようにします。この場合は~/Areas/Evernote/Views。私のブログ投稿で取り上げたのは、Evernoteエリアからコントローラーがデフォルトルートにマッピングされていることを排除する方法でした。

この助けを願っています!

よろしく

ホーカン

2
Håkan Edling