@ Html.DisplayFor構文とは何ですか?


223

Razorでは、@ Htmlがリンクや入力などのHTMLを生成するなど、多くの優れた機能を実行することを理解しています。

しかし、DisplayFor関数を取得できません...

なぜ私は書くでしょう:

@Html.DisplayFor(model => model.Title)

私が書くことができたとき:

@Model.Title

回答:


217

Html.DisplayFor() プロパティのタイプと一致するDisplayTemplateをレンダリングします。

何も見つからない場合は、を呼び出します.ToString()


表示テンプレートがわからない場合はDisplayTemplates、コントローラーに関連付けられているビューフォルダー内のフォルダーに配置できる部分的なビューです。


例:

次のコードを使用して、viewsフォルダーのフォルダーString.cshtml内に名前が付けられたビューDisplayTemplates(例:HomeまたはShared)を作成するとします。

@model string

@if (string.IsNullOrEmpty(Model)) {
   <strong>Null string</strong>
}
else {
   @Model
}

次に@Html.DisplayFor(model => model.Title)(それTitleが文字列であると仮定して)テンプレートを使用し<strong>Null string</strong>、文字列がnullまたは空かどうかを表示します。


6
ほとんどの場合、プリミティブ型にDisplayForを使用するのは無意味だと思います。たとえば、DateTimeは、時刻の部分が役に立たなくても、日付/時刻を表示します。モデルのプロパティの属性で、DateTimeタイプに「{0:d}」のフォーマット文字列を指定できた場合、DisplayForの方が役立つ可能性があります。
enorl76 2012年

6
@ enorl76できます。Daveoの回答を参照してください。
Bertrand Marron、2012年

3
たとえば、DateTimeデータ型のEditorForテンプレートにjQuery日付ピッカーを追加して、常にフォームで日付ピッカーを表示することができます。
ザカリースコット

4
一般的にそれを使うのはやり過ぎだと私には思えますが、特定のモデル属性の出力をフォーマットする場合に使用する必要があります。役立つ質問と回答の皆さん、ありがとうございます。すべてのラウンドで+1。
ロビンウィンスロー

同じ名前のモデルが2つある場合はどうなりますか?
halivingston 2014年

77

主なメリットは、独自の表示テンプレートを定義するか、データアノテーションを使用することだと思います。

たとえば、タイトルが日付の場合、次のように定義できます。

[DisplayFormat(DataFormatString = "{0:d}")]

そして、すべてのページで一貫した方法で値を表示します。そうでない場合は、複数のページの表示をカスタマイズする必要がある場合があります。したがって、プレーンな文字列にはあまり役立ちませんが、通貨、日付、電子メール、URLなどには役立ちます。

たとえば、メールアドレスがプレーンな文字列ではなく、リンクとして表示される場合があります。

<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>

28

DisplayForテンプレート化にも役立ちます。モデルのテンプレートを作成して、次のようなことを行うことができます。

@Html.DisplayFor(m => m)

に似てい@Html.EditorFor(m => m)ます。これはDRYプリンシパルに役立ち、同じモデルに対して同じ表示ロジックを何度も書く必要がなくなります。

MVC2テンプレートに関するこのブログをご覧ください。それはまだMVC3に非常に適用可能です:

http://www.dalsoft.co.uk/blog/index.php/2010/04/26/mvc-2-templates/


また、モデルにデータアノテーションがある場合にも役立ちます。たとえば、モデルのプロパティがEmailAddressデータアノテーションで装飾されている場合、DisplayForはそれをmailto:リンクとしてレンダリングします。


8
@Html.DisplayFor(m => m)単純化することもできます@Html.DisplayForModel()
ブラントボビー

ラムダ式とは何ですか(m => m)?最初のmは何を表していますか?
アルカディアン2013年

1
最初のmはパラメーターの名前です
Sinaesthetic

1
@ magic-c0d3r最初のmは、ページのModelオブジェクトです。これがラブムダ式で使用されているものです
Don Cheadle

4

しばらく自分の答えを探していたところ、何かを見つけることができました。一般的に、それを1つのプロパティだけに使用している場合、生成されたHTMLの「ソースの表示」を実行しても同じように見えます。たとえば、クラスのNameプロパティのみを表示したい場合、以下のようなHTMLが生成されます。

    <td>
    myClassNameProperty
    </td>
   <td>
    myClassNameProperty, This is direct from Item
    </td>

これは、以下のコードから生成されたHTMLです

<td>
@Html.DisplayFor(modelItem=>item.Genre.Name)            
</td>

<td>
@item.Genre.Name, This is direct from Item
</td>

同時に、この場合に「Genre」クラスのすべてのプロパティを1つのステートメントで表示したい場合は、@ Html.DisplayFor()を使用して入力を節約できます。

以下のように、ジャンルのプロパティごとに個別のステートメントを書く代わりに、@ Html.DisplayFor(modelItem => item.Genre)を書くことができます

@item.Genre.Name
@item.Genre.Id
@item.Genre.Description

プロパティの数によって異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.