概要
Visual Studio のASP.NET MVC 5(.NET Framework)でよく使用されるフォルダ構成について、まとめてみました。
目次
ASP.NET MVC 5 と ASP.NET Core MVC の違い
同じ「MVC」という名前でも、ASP.NET MVC 5 と ASP.NET Core MVC は 基盤となるフレームワークが異なるため、プロジェクト構成や設定方法、運用の前提が変わります。
ASP.NET MVC 5(.NET Framework)
Windows/IIS 上で動作し、 .NET Framework が土台になっています。System.Web、Global.asax、App_Start、Web.config などの仕組みを使います。この記事でフォルダ構成を解説するのはこちらです。
ASP.NET Core MVC(.NET)
クロスプラットフォームの .NET(Core) が土台になっています。既定では Kestrel で動き、Program.csにミドルウェアやルーティングをまとめます。設定は appsettings.json が中心です。
どちらを使用する?
新規開発やクロスプラットフォームの場合は Core での開発が中心です。既存の .NET Framework/IIS 前提のシステムをそのまま保守・改修したい場合はASP.NET MVC 5を使用します。
フォルダ構成
1. Views
通常のビュー(アクション名と一致)
既定では、Viewファイルは ~/Views/{Controller名}/{Action名}.cshtml をまず探し、見つからなければ~/Views/Shared/{Action名}.cshtml を探します。
~/Views/{Controller名}/{Action名}.cshtml
~/Views/Shared/{Action名}.cshtml(共通化)
~/Views/Shared/ は「複数のコントローラーから使い回すビュー(=共有ビュー)」を置くための場所です。
レイアウト
サイト全体で共通に使うページ枠(ヘッダー、ナビ、フッター、スクリプト・CSSの読み込みなど)を定義するのがレイアウトファイルです。各ビューはレイアウトの「枠」に@RenderBody()で自分の中身を差し込みます。
このファイルもSharedの中に配置します。
典型:~/Views/Shared/_Layout.cshtml
※ _ViewStart.cshtml で Layout = "~/Views/Shared/_Layout.cshtml"; のように指定
部分ビュー(Partial)
ページの一部を切り出し、再利用可能な断片として使うためのビューです。ヘッダー、フッター、メニュー、一覧の1行、カードなど「同じ見た目・構造」を複数ページで使い回すときに便利です。慣習的にファイル名の先頭を _(アンダースコア) にします(例:_Header.cshtml)。配置は、呼び出し側ビューと同じフォルダか ~/Views/Shared/ が定番です。
置き場所は通常ビューと同じ規約(Views/{Controller} または Views/Shared)
先頭に _ を付けるのは慣習であり必須ではありません(_Menu.cshtml など)
テンプレート(EditorTemplates / DisplayTemplates)
型や名前に応じて自動で選ばれるビューです。同一型の表示・編集 UI を一か所で定義して全ページで再利用できます。置き場所は以下のいずれかで、自動探索されます。
~/Views/{Controller}/EditorTemplates/{Template名}.cshtml
~/Views/Shared/EditorTemplates/{Template名}.cshtml
~/Views/{Controller}/DisplayTemplates/{Template名}.cshtml
~/Views/Shared/DisplayTemplates/{Template名}.cshtml
Html.EditorFor(...) / Html.DisplayFor(...) がここを自動探索
Areas(領域)
大規模アプリを「機能のまとまり」ごとにミニMVC(Controller・Views・Models のセット)へ分割する仕組みです。
例:Admin、Customer、Billing、Reports など、URLやフォルダを機能別に分けて管理できます。
~/Areas/{Area名}/Controllers/...
~/Areas/{Area名}/Views/{Controller}/{Action}.cshtml
~/Areas/{Area名}/Views/Shared/...
ビュー用 Web.config
ビュー専用の設定ファイルで、ビューの直接アクセスを遮断する設定もここに入っています。直接 URL で .cshtml 等にアクセスされた場合は 404 を返すハンドラ(HttpNotFoundHandler)の登録が含まれており、これがビューの直接公開を防止しています。削除してしまうと、ビューが直接リクエストで到達してしまうなど、MVC の基本設計(コントローラー経由)を崩す恐れがあります。
~/Views/Web.config(Razor の設定用。MVC プロジェクトでは重要)
_ViewStart.cshtml
_ViewStart.cshtml は、各ビュー(.cshtml)がレンダリングされる直前に毎回実行される“共通の前処理”ファイルです。既定レイアウトの指定や簡単な初期化に使います。ファイル名に_が付いていますが、部分ビューではありません。
~/Views/_ViewStart.cshtml(下位フォルダに置けばその配下にだけ適用)
2. ルーティング・設定類(読み込み規約)
既定では起動時に Global.asax の Application_Start から App_Start フォルダ配下の以下の設定クラスが呼び出されます。
RouteConfig.cs(RegisterRoutes で MVC ルート登録)
FilterConfig.cs(グローバルフィルタ登録)
BundleConfig.cs(バンドル登録:Scripts.Render / Styles.Render で使用)
3. 静的ファイル
CSS
CSSは、Contentフォルダ内に配置されるのが一般的です。
~/Content/site.css
~/Content/bootstrap.css
JavaScript
JavaScriptはScriptsフォルダに配置されるのが一般的です。
~/Scripts/jquery.js
~/Scripts/bootstrap.js
~/Scripts/app/*.js
画像・フォント
画像はContent/imagesフォルダ内、フォントはContent/fontsフォルダ内に配置されるのが一般的です。
~/Content/images/
~/Content/fonts/(または ~/Images/, ~/Fonts/ など)
4. App_Data
アプリが内部で使うデータファイルを置くフォルダです。例としてXML/JSON などの設定ファイル、一時的な保存用ファイル(エクスポート、キャッシュ、簡単なログ)などが該当します。
IIS(Webサーバー)は App_Data を“公開対象外”にしているため、URLで直接読めません。つまり、ブラウザから直リンクされない安全な保管場所として使えます(中のファイルはコードから読み書きします)。
5. コード整理(フォルダは規約強制ではないが慣習)
Controllers
ControllerクラスはControllersフォルダに配置するのが一般的です。
~/Controllers/(FooController など)
Models
ModelクラスはModelsフォルダに配置するのが一般的です。
~/Models/
ViewModels
ViewModelクラスはViewModelsフォルダに配置するのが一般的です。もしくは、上記のModelsフォルダに配置することもあります。
~/ViewModels/
Filters
FilterクラスはFiltersフォルダに配置するのが一般的です。
~/Filters/(カスタムフィルタ属性をまとめる)
フォルダ構成のサンプル
以下は、MVC5のフォルダ構成のサンプルです。
/App_Start
BundleConfig.cs
FilterConfig.cs
RouteConfig.cs
/App_Data
/bin
/Content
site.css
images/
/Controllers
HomeController.cs
/Models
/Scripts
jquery-3.7.0.js
/Views
/Home
Index.cshtml
About.cshtml
/Shared
_Layout.cshtml
_LoginPartial.cshtml
_ViewStart.cshtml
Web.config
/Areas
/Admin
/Controllers
/Views
/Dashboard
Index.cshtml
/Shared
_Layout.cshtml
Global.asax
Web.config
終わりに
フォルダ構成にはルールが多く、最初は覚えるのが大変ですが、一度理解してしまえば一定のパターンが決まっているため、対応は比較的楽になるかなと思います。