各エリアのフォルダ内に*AreaName*AreaRegistration.cs
ファイルが表示されます。これは、エリア ルーティング ルールが保存される場所です。デフォルトでは、それらが生成されると、他のすべてよりも先にエリア名が含まれます。問題は、ルートからエリア名「フォルダー」を削除すると、ルートがすべての「標準」 {controller}/{ をキャッチすることです。 action}/{id} リクエスト。これは明らかにあなたが望むものではありません..
これを克服するために、ルートに存在するコントローラー名に基づいて、ルートに正規表現フィルターを追加できます。欠点は?アプリ内で同じ名前のコントローラーを 2 つ持つことはできません (少なくとも標準ルートを使用しないでください..それらにアクセスする別のルートをいつでも考えることができます:))
最後に..この構造を持つ:
/Areas
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs
あなたが持っているべきものは、次のような sth です:
context.MapRoute(
"Blog_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(Blog|Feed)" }
);
UserAreaRegistration.cs で:
context.MapRoute(
"User_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(User)" }
);
Global.asax.cs で:
public static void RegisterRoutes(RouteCollection routes)
{
context.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
global.asax エリアでは、登録が最初に行われることに注意してください。:)
UPD:
質問の更新に基づいて: エリアを使用する場合に考慮しなければならない重要な点が 1 つあります: エリア間リンクがある場合は、リンクにエリア名も指定する必要があります. 例えば
<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %>
あなたはアイデアを得る。
複数のモデル/ビューに関しては、現時点ではこのような構造に従っています
/Code/ // ライブラリに移動されないヘルパー、拡張クラス
/Models/Data/ // EF クラス + 検証クラスはここにあります
/Models/ViewModels/{controller}/ // コントローラーごとに格納されたビュー モデル
これまでのところ問題なく動作しており、ソリューションを比較的整理しておくことができました。私が述べたように、私がこれまでに作成した唯一のエリアは、ウェブサイトの他の部分とは大きく異なるAdmin
ため、エリアです:)