ASP.NET MVC弱者なのがつらい今日この頃。ASP.NET MVCの基本のテンプレートを見ながら少しだけ構造をメモっておこうと思います。主にViewまわり
- Views
- Shared
- _Layout.cshtml
- Error.cshtml
- _ViewStart.cshtml
- Web.config
- Shared
_Layout.cshtml
ページのテンプレートになる人。中身はこんなかんじ。
<!DOCTYPE html><html><head><metacharset="utf-8" /><metaname="viewport"content="width=device-width" /><title>@ViewBag.Title</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr")</head><body> @RenderBody() @Scripts.Render("~/bundles/jquery") @RenderSection("scripts", required: false) </body></html>
@RenderBody()で、このテンプレートを使ったページの本体を出力しつつ、@RenderSection(セクション名, required: 必須かどうか)を使って、メインのボディ部分以外も、このテンプレートを適用した人でカスタマイズできるようにしている。
因みにセクションの部分はテンプレートを適用したViewで@section セクション名 { ... }のようにして書くことができる。Razorすっきりかけていいよ。例えば以下のような感じ。
@{ ViewBag.Title = "Index"; } <h2>Index</h2> @section scripts { <scripttype="text/javascript"> $(function(){ $('h2').text("Hello jQuery");});</script> }
Error.cshtml
エラーページ。FilterConfigでグローバルに指定されているHandleErrorAttributeがデフォルトで表示するエラーページ。MSDNにもがっつりかいてある。
既定では、HandleErrorAttribute 属性を設定されたアクション メソッドが例外をスローすると、MVC は ~/Views/Shared フォルダーにある Error ビューを表示します。
_ViewStart.cshtml
名前の通りViewの最初に自動で埋め込むやつ。さっき説明した_Layout.cshtmlは、ここでLayoutに指定されてるから特に何もしない場合は自動で適用されるという仕掛け。
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
Web.config
アプリケーションのルートにあるWeb.configではないことに注意。おそらく、Viewsフォルダの下にあるcshtmlを隠すことが主な目的だと思われる…。以下のような記載があるので。
<httpHandlers><add path="*"verb="*"type="System.Web.HttpNotFoundHandler"/></httpHandlers>
まとめ
ViewsのSharedとか_Layoutとか_ViewStartとか、空で作るといつも名前なんだっけ…ってなるので個人的なメモでした。
プロジェクトテンプレートは、なんだこんなにコード吐きやがって!!と思っても、これだけのコードを吐くということは、作成者側に何らかの意図があるということなので理解したうえで、捨てるなら捨てるというのがよろしいかと思います。