書籍転載:ASP.NET MVC 5 実践プログラミング
モデル単位にテンプレートを決定する - DisplayForModel/EditorForModelメソッド[Razor]
プロパティ単位ではなくモデル単位でHTMLコードを出力するDisplayForModel/EditorForModelメソッドについて解説。また、そのテンプレートを自作する方法を説明する。書籍転載の17本目(基礎編「4-4-4」)。
書籍転載について
本コーナーは、秀和システム発行の書籍『ASP.NET MVC 5 実践プログラミング』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。
『ASP.NET MVC 5 実践プログラミング』の詳細や購入は秀和システムのサイトや目次ページをご覧ください。
ご注意
本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。
4-4-4 モデル単位にテンプレートを決定する - DisplayForModel/EditorForModelメソッド
プロパティ単位の出力を生成するDisplayFor/EditorForメソッドに対して、モデル単位の出力を生成するのがDisplayForModel/EditorForModelメソッドです*30。たとえば、新規作成画面(Create.cshtml)と編集画面(Editor.cshtml)などで入力フォームを共有するならば、EditorForModelメソッドを利用するのが便利です。
- *30 ただし、DisplayFor/EditorForメソッドでも
@Html.DisplayFor(model => model)
でモデル単位の出力を生成できます。
デフォルトの挙動
あまり利用することはないかもしれませんが、まずは独自テンプレートを定義しない、デフォルトの挙動を確認しておきましょう。Scaffolding機能で自動生成したビューを以下のように書き換えてみましょう。太字が追記部分、薄字が削除部分を表します。
<div class="form-horizontal">
@Html.EditorForModel()
<h4>Article</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
... 中略 ...
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
|
モデルで定義されたプロパティ情報に沿って、フォーム要素が順に生成されていることが確認できます。機械的に生成された結果、class属性などは一切付与されていませんので、Bootstrapによるスタイルも適用されていない無味乾燥なフォームです。
自作テンプレートによるカスタマイズ
上の結果を見てもわかるように、通常、DisplayForModel/EditorForModelメソッドをデフォルトのままに利用することはあまりありません*31。そこで、先ほどと同じく、テンプレートを自作してみましょう。
- *31 自動生成されたフォームをそのまま利用するにしても、Scaffolding機能で生成されたコードの方が余程リッチです。
テンプレートの配置先は、DisplayFor/EditorForメソッドと同じく、「~/Views/Shared/DisplayTemplates」「~/Views/Shared/EditorTemplates」フォルダーです。ファイル名はエンティティのそれに対応して、(たとえば)ArticleエンティティであればArticle.cshtmlのように命名します。
テンプレートの内容は、本来、用途に応じてカスタマイズすべきですが、ここではScaffolding機能で自動生成された内容をそのまま利用します。
@model MvcView.Models.Article
<h4>Article</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Url, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Url, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Url, "", new { @class = "text-danger" })
</div>
</div>
... 中略 ...
<div class="form-group">
@Html.LabelFor(model => model.Released, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
<div class="checkbox">
@Html.EditorFor(model => model.Released)
@Html.ValidationMessageFor(model => model.Released, "", new { @class = "text-danger" })
</div>
</div>
</div>
|
この状態でアプリケーションを再起動してみると、今度はArticle.cshtmlを利用してフォームが生成されていることが確認できます。ここでは新規作成画面(Create.cshtml)だけを修正しましたが、編集画面(Edit.cshtml)もEditorForModelメソッド対応にすれば、フォームを同一のテンプレートで共有できます。
※以下では、本稿の前後を合わせて5回分(第15回~第19回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
15. テンプレート関連のビューヘルパー|テンプレートの標準の挙動[Razor]
「テンプレートヘルパー」とも呼ばれるDisplayFor/EditorForメソッドについて紹介。また、テンプレートヘルパーの標準的な挙動を確認する。書籍転載の15本目(基礎編「4-4-1」)。
16. テンプレートのカスタマイズ|テンプレートを決定する方法[Razor]
テンプレートヘルパーでは、特定のデータ型/メタ情報に応じた独自のテンプレートを用意して、独自の出力を生成することもできる。その方法を解説する。書籍転載の16本目(基礎編「4-4-2」「4-4-3」)。
17. 【現在、表示中】≫ モデル単位にテンプレートを決定する - DisplayForModel/EditorForModelメソッド[Razor]
プロパティ単位ではなくモデル単位でHTMLコードを出力するDisplayForModel/EditorForModelメソッドについて解説。また、そのテンプレートを自作する方法を説明する。書籍転載の17本目(基礎編「4-4-4」)。
18. LINQとは?[C#]
LINQ to Entitiesの説明に入る前に、まずはC#の言語機能として組み込まれたクエリ機能「LINQ」について簡単に紹介する。書籍転載の18本目(基礎編「5-3-1」)。
19. LINQ:データの検索条件を指定する - where句[C#]
クエリ後の結果セットをフィルターするためのwhere句/Whereメソッドについて解説する。書籍転載の19本目(基礎編「5-3-2」)。