【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();
            });
        }
    }

【社内PR】チーム・ウォーク

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

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

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

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

※ご相談は無料でお受けいたします。

この記事へのコメント

ニックネーム(任意)

返信通知先Emailアドレス(任意)

本文


* 感想やご意見等、お気軽にコメントください。但し、公序良俗に反するコメントはお控えください。
* 管理者が承認したコメントはこの箇所に公開させていただく可能性がございます。
* 返信通知先Emailアドレスは、筆者のみに通知され、公開されることはありません。返信通知先Emailを入力された場合は、コメントへの返信をこちらに掲載した際に通知させていただきます。その他の目的には使用いたしません。
* スパム対策のため、コメントは日本語のみ受け付けております。

堺財経電算合同会社 小規模IT構築サービス