Razorでは、@ Htmlがリンクや入力などのHTMLを生成するなど、多くの優れた機能を実行することを理解しています。
しかし、DisplayFor関数を取得できません...
なぜ私は書くでしょう:
@Html.DisplayFor(model => model.Title)
私が書くことができたとき:
@Model.Title
Razorでは、@ Htmlがリンクや入力などのHTMLを生成するなど、多くの優れた機能を実行することを理解しています。
しかし、DisplayFor関数を取得できません...
なぜ私は書くでしょう:
@Html.DisplayFor(model => model.Title)
私が書くことができたとき:
@Model.Title
回答:
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または空かどうかを表示します。
主なメリットは、独自の表示テンプレートを定義するか、データアノテーションを使用することだと思います。
たとえば、タイトルが日付の場合、次のように定義できます。
[DisplayFormat(DataFormatString = "{0:d}")]
そして、すべてのページで一貫した方法で値を表示します。そうでない場合は、複数のページの表示をカスタマイズする必要がある場合があります。したがって、プレーンな文字列にはあまり役立ちませんが、通貨、日付、電子メール、URLなどには役立ちます。
たとえば、メールアドレスがプレーンな文字列ではなく、リンクとして表示される場合があります。
<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>
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:
リンクとしてレンダリングします。
@Html.DisplayFor(m => m)
単純化することもできます@Html.DisplayForModel()
。
しばらく自分の答えを探していたところ、何かを見つけることができました。一般的に、それを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
プロパティの数によって異なります。