エリアへのカスタム ルートは、AreaRegistration クラスに登録する必要があります。Global.asx.cs にはありません。
NewsAreaRegistration
ルートを追加するには、エリア ルートの後に新しいデフォルト ルートをサーバーに変更して追加します。(ここでは順番が重要です!)
より具体的なルートを照合できるように、デフォルト ルートは常にルーティング テーブルの一番下にある必要があります。
メソッド内のルートは次のRegisterArea
ようになります。
context.MapRoute(
"News_default",
"News/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
context.MapRoute(
"DefaultStart",
"",
new { controller = "Articles", action = "IndexOfArticles"}
);
更新Application_Start
: Global.asx.cs ファイルのメソッドで領域を登録したことを確認する必要があることを忘れていました。
AreaRegistration.RegisterAllAreas();
更新 2: ASP.NET MVC でのルーティングのしくみ
私はあなたの懸念を理解しています。ルーティングのしくみを簡単に説明します。
ASP.NET MVc には、すべての URL 要求に一致するために使用されるルーティング テーブルが 1 つあります。
Global.asx.cs または AreaRegistration にルートを登録すると、それらのルートは、登録された順序でルーティング テーブルに追加されます (そのため、順序が重要であり、より具体的なルートを一番上にプッシュする必要があります。マッチングできます)。
エリアルート(AreaRegistration
クラスに登録されているルート)の場合。これらは常に、Global.asx.cs ファイルに登録されているルートの前にルーティング テーブルの先頭に追加されます (エリア ルートが最初に一致するルートです)。 News という名前のコントローラー。
複数のエリアがある場合、どのエリアのルートが最初にチェックされますか? 100% 確実ではありませんが、実験によって、それらが作成時間順に並べられていることがわかりました。古い領域がルーティング テーブルの一番上に来ます。(同じ名前のエリアが 2 つ存在しないため、特に問題はありません)
例:
次の領域を作成したとします。News
、Dashboard
、Api
上記の例のように、ルートルートと一致するように、次のルートを NewsAreaRegistration に追加しました
context.MapRoute(
"DefaultStart",
"",
new { controller = "Articles", action = "IndexOfArticles"}
);
ルーティング テーブルは次のようになります。
No Route Name URL Explanation
1 News_default News/{controller}/{action}/{id} Default For News Area
2 DefaultStart (empty) Root Route (match root url)
3 Dashboard_default Dashboard/{controller}/{action}/{id} Default For Dashboard Area
4 Api_default Api/{controller}/{action}/{id} Default For Api Area
5 Default {controller}/{action}/{id} Default (No Areas)
アプリケーションがリクエストを受け取ったとき。ルートを 1 つずつ調べて一致を探します。私たちの場合、ルート URL をリクエストするとき。2 番目のルートが一致します。controller = "Articles" と action = "IndexOfArticles" のデフォルト値を設定しているため、リクエストはそれに応じてリダイレクトされます。
お役に立てば幸いです。