asp.net MVC4 + Razorでインターフェースを作ってみる
とはいえ asp.net MVCも初めてなのでチュートリアルで流しながら構造を見てみる。
チュートリアルに従うだけなので流れは割愛して軽くファーストインプレッション。
MVCでのファイル構成
ざーっと見た感じ、こうなってるようだ
- App_Data
- まだ謎
- App_Start
- ルーティング定義や認証の設定などスタートアップで使われそうなグローバルなクラスが置かれてる。これらはGlobal.asaxのapplicationStart()で登録される。
- Content
- テーマやスタイルシートが使われてる。テーマはどこで適用するのかまだ不明。
- Controllers
- コントローラークラスがここに配置される。モデルからスキャフォールド作るときはここから 追加>コントローラー と。
- Filters
- InitializeSimpleMembershipAttributeてのが置かれてる。認証関連のDBのコネクションの準備をしてるようだけどなんでここでやってるのかは不明
- Images
- 画像
- Migrations
- Code First Migrationsの移行クラスが作成される。
- Models
- Model置き場。
- Scripts
- Javascript置き場。Content/themesにもJavascriptが入ってるのでそのへんどうなのか。
- Views
- Viewのcshtmlが置かれる。Views以下にControllerと同名のフォルダ、その中にActionと同名のcshtmlを置かれる。
Viewの構成
チュートリアルのまま作られた場合呼び出し構成は
/Views/_ViewStart.cshtml
↓ @{Layout="~"}
/Views/Shared/_Layout.cshtml --(@Partial)→ LoginPartial.cshtml
↓ @RenderBody
<各Actionのcshtml>
という感じに呼ばれてる。
最初の_ViewStart.cshtmlというファイルをどこかで特に指定したりしてないようなので、デフォルトでロードされるファイル名なのかもしれない*1
正確には、「Razorは、名前がアンダースコアで始まるビューへの直接アクセスを禁止」している。通常、部分ビューへの直接アクセスは想定していないはずなので、あらかじめ名前付けレベルでガードしておくのが望ましい。
第7回 レイアウト/部分ビューでアプリ共通のデザインを定義 - @IT
という理由もあるようだ。
_Layout.cshtml の構造について
<!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta charset="utf-8" /> <title>@ViewBag.Title - TodoList アプリケーション</title> <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> <meta name="viewport" content="width=device-width" /> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <body> <header> <div class="content-wrapper"> <div class="float-left"> <p class="site-title">@Html.ActionLink("ToDo", "Index", "Home")</p> </div> <div class="float-right"> <section id="login"> @Html.Partial("_LoginPartial") </section> <nav> <ul id="menu"> <li>@Html.ActionLink("ホーム", "Index", "Home")</li> <li>@Html.ActionLink("バージョン情報", "About", "Home")</li> <li>@Html.ActionLink("連絡先", "Contact", "Home")</li> </ul> </nav> </div> </div> </header> <div id="body"> @RenderSection("featured", required: false) <section class="content-wrapper main-content clear-fix"> @RenderBody() </section> </div> <footer> <div class="content-wrapper"> <div class="float-left"> <p>© @DateTime.Now.Year -Todo List アプリケーション</p> </div> </div> </footer> @Scripts.Render("~/bundles/jquery") @RenderSection("scripts", required: false) </body> </html>
metaの中にある@Scripts.Renderや@Styles.Renderで指定してるパスはっぽい文字列はディレクトリ名じゃなくてApp_StartのBundleConfigで指定されてるバンドル名かな。
public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( "~/Scripts/modernizr-*")); bundles.Add(new StyleBundle("~/Content/themes/base/css").Include( "~/Content/themes/base/jquery.ui.core.css", "~/Content/themes/base/jquery.ui.resizable.css", "~/Content/themes/base/jquery.ui.selectable.css", "~/Content/themes/base/jquery.ui.accordion.css", "~/Content/themes/base/jquery.ui.autocomplete.css", "~/Content/themes/base/jquery.ui.button.css", "~/Content/themes/base/jquery.ui.dialog.css", "~/Content/themes/base/jquery.ui.slider.css", "~/Content/themes/base/jquery.ui.tabs.css", "~/Content/themes/base/jquery.ui.datepicker.css", "~/Content/themes/base/jquery.ui.progressbar.css", "~/Content/themes/base/jquery.ui.theme.css"));
(゚∀゚)
長くなりすぎたので一旦区切る。
*1:要確認