書籍転載:ASP.NET MVC 5 実践プログラミング

書籍転載:ASP.NET MVC 5 実践プログラミング

モデル単位にテンプレートを決定する - DisplayForModel/EditorForModelメソッド[Razor]

2014年11月11日

プロパティ単位ではなくモデル単位で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機能で自動生成したビューを以下のように書き換えてみましょう。太字が追記部分、薄字が削除部分を表します。

Razor
<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>
リスト4-32 Views/Articles/Create.cshtml
図4-8 自動生成された入力フォーム

 モデルで定義されたプロパティ情報に沿って、フォーム要素が順に生成されていることが確認できます。機械的に生成された結果、class属性などは一切付与されていませんので、Bootstrapによるスタイルも適用されていない無味乾燥なフォームです。

自作テンプレートによるカスタマイズ

 上の結果を見てもわかるように、通常、DisplayForModel/EditorForModelメソッドをデフォルトのままに利用することはあまりありません*31。そこで、先ほどと同じく、テンプレートを自作してみましょう。

  • *31 自動生成されたフォームをそのまま利用するにしても、Scaffolding機能で生成されたコードの方が余程リッチです。

 テンプレートの配置先は、DisplayFor/EditorForメソッドと同じく、「~/Views/Shared/DisplayTemplates」「~/Views/Shared/EditorTemplates」フォルダーです。ファイル名はエンティティのそれに対応して、(たとえば)ArticleエンティティであればArticle.cshtmlのように命名します。

 テンプレートの内容は、本来、用途に応じてカスタマイズすべきですが、ここではScaffolding機能で自動生成された内容をそのまま利用します。

Razor
@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>
リスト4-33 Views/Shared/EditorTemplates/Article.cshtml

 この状態でアプリケーションを再起動してみると、今度は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」)。

サイトからのお知らせ

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • 日本マイクロソフト株式会社
  • グレープシティ株式会社