【ASP.NET Core】
Viewsのサブフォルダー構造を実現するルーティング設定

記事イメージ


(最終更新日:

お疲れ様です。堺です。

ASP.NET Coreはドキュメントが比較的少なめで、細かい設定に苦労しています。

公式ドキュメントを見てもなかなか難しかった、Viewsをサブフォルダー(サブディレクトリ)構造で管理したい場合のルーティング設定を共有します。

実現したいフォルダー配置

次のように、トップビューのURLを生かしつつ、例えばマスタページであればMasterフォルダに格納したIndex.cshtmlにアクセスするようにルーティングします。

#トップビューURL
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
Areasフォルダーは、プロジェクトルート直下にViewsと並列で設置します。
Areasフォルダーは、プロジェクトルート直下にViewsと並列で設置します

実装③ 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開発事業を行っております。

この記事をご覧になり、もし相談してみたい点などがあれば、ぜひ問い合わせフォームまでご連絡ください。

皆様のご投稿をお待ちしております。

記事筆者へ問い合わせする

※ご相談は無料でお受けいたします。
IT活用経営を実現する - 堺財経電算合同会社