お疲れ様です。堺です。
ASP.NET Coreはドキュメントが比較的少なめで、細かい設定に苦労しています。
公式ドキュメントを見てもなかなか難しかった、Viewsをサブフォルダー(サブディレクトリ)構造で管理したい場合のルーティング設定を共有します。
◇目次
実現したいフォルダー配置
次のように、トップビューのURLを生かしつつ、例えばマスタページであればMasterフォルダに格納したIndex.cshtmlにアクセスするようにルーティングします。
https://localhost:49163/
#マスタページURL
https://localhost:49163/Master/User/
#想定するフォルダ構造
#(このように配置しても動きません。次のセクションで実装手順を解説しますので、そちらをご参照)
📁Views
┣📁Home
┃┗Index.cshtml (トップビュー)
┃
┗📁Master
┗📁User
┗Index.cshtml
┗Edit.cshtml
┗Create.cshtml
実装① Setup.cs
Setup.csにルーティング情報を追加します。「エリア」という単位をサブフォルダーに相当させます。
次のコードのように、endpoints.MapControllerRouteメソッドでAreaを使用するルーティング規則を追加します。
C#
public class Startup {
//~中略~
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
//~中略~
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute(name: "use-area", pattern: "{area}/{controller=Home}/{action=Index}/{id?}"); //追加!
endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
}
実装② cshtmlファイル、Controllerファイルの配置
サブフォルダーに配置するcshtmlファイルは、Viewsフォルダ―ではなく、Areasフォルダーに配置されます。(自動生成されますが、存在していなければ作成しましょう。)
Project
┣📁Controllers
┃┣HomeController
┃┗UserController ※コントローラーは層構造不要
┃
┣📁Views
┃┗📁Home
┃ ┗Index.cshtml ※トップビュー
┃
┗📁Areas
┗📁Master
┗📁Views
┗📁User
┣Index.cshtml
┣Edit.cshtml
┗Create.cshtml
実装③ Controllerファイル
最後に、クラス属性でエリア名をコントローラーに付与します。
C#
[Area("Master")] //←追加!
public class UserController : Controller {
public IActionResult Index() {
return View(_allData);
}
#~中略~
}
Razorでのリンク生成
Razorでリンクを張るときは、次のようにasp-area属性でエリアを指定します。
また、エリアを使用しないリンク(プロジェクト直下のViewsフォルダに対するリング)を生成は、asp-areaに空白文字を指定することで実現できます。
Razor
//https://localhost:49163/Master/User/
<a asp-area="Master" asp-controller="User" asp-action="Index">ユーザー一覧</a>
//https://localhost:49163/
<a asp-area="" asp-controller="Home" asp-action="Index">ホーム</a>
リダイレクト処理(2021/12/4追加)
RedirectToActionメソッドでリダイレクトするときも要領は同じです。
第3引数のrouteValuesに匿名クラスオブジェクトでエリア名を渡します。エリアを使用しないときは空文字を指定してください。
C#
//https://localhost:49163/Master/User/
return RedirectToAction("Index", "User", new { area = "Master" });
//https://localhost:49163/
return RedirectToAction("Index", "Home", new { area = "" });
参考リンク:公式ドキュメント
こちらのドキュメントにリダイレクト以外の項目については詳しく述べられています。分かった後に読むと「なるほど」なのですが、なかなか辿り着けないのが難点でした・・・
結び
ASP.NET Coreでは目下開発フェーズのため、新しい情報があれば随時アップデートしていきます。
今回もどうもありがとうございました。
記事筆者へのお問い合わせ、仕事のご依頼
当社では、IT活用をはじめ、業務効率化やM&A、管理会計など幅広い分野でコンサルティング事業・IT開発事業を行っております。
この記事をご覧になり、もし相談してみたい点などがあれば、ぜひ問い合わせフォームまでご連絡ください。
皆様のご投稿をお待ちしております。