Для чого синтаксис @ Html.DisplayFor?


223

Я розумію, що в Razor, @Html робить купу акуратних речей, як-от генерування HTML для посилань, входів тощо.

Але я не отримую функцію DisplayFor ...

Навіщо мені писати:

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

коли я міг просто написати:

@Model.Title

Відповіді:


217

Html.DisplayFor() відобразить DisplayTemplate, який відповідає типу властивості.

Якщо він не може знайти жодного, я вважаю, що він викликає .ToString().


Якщо ви не знаєте про шаблони відображення, це часткові представлення даних, які можна помістити в DisplayTemplatesпапку всередині папки перегляду, пов'язаної з контролером.


Приклад:

Якщо ви створюєте подання, назване 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>якщо рядок є нульовим або порожнім.


6
Мені здається, що в більшості випадків використовувати DisplayFor для примітивних типів. Наприклад, DateTime відображатиме дату / час, навіть якщо часова частина була марною. Якщо ви можете вказати рядок формату "{0: d}" для типу DateTime в атрибутах властивості в моделі, DisplayFor може бути кориснішим.
enorl76

6
@ enorl76 ви можете. Дивіться відповідь Давео .
Бертран Маррон

3
Ви можете додати інструмент вибору дати jQuery до шаблону EditorFor для типу даних DateTime, щоб завжди відображати інструмент вибору дати у формах, наприклад.
Захарі Скотт

4
Мені здається, що це надмірна інженерія, щоб використовувати його взагалі, але що ви повинні використовувати його, коли ви хочете відформатувати вихід для певних атрибутів моделі. Корисне запитання та відповіді, хлопці, дякую. + 1 сек.
Робін Уінслоу

що станеться, якщо у вас дві моделі з однаковою назвою?
halivingston

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)? Що представляють перші м?
Аркадіан

1
перший m - назва параметра
Sinaesthetic

1
@ magic-c0d3r перший m - це об'єкт Model на сторінці. Ось що використовується в лабмдаському виразі
Дон

4

Деякий час шукаючи відповіді для себе, я міг щось знайти. загалом, якщо ми використовуємо його лише для одного ресурсу, воно виглядає однаково, навіть якщо ми робимо "Перегляд джерела" згенерованого HTML. Нижче генерується HTML, наприклад, коли я хочу відображати лише властивість Name для мого класу

    <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>

У той же час зараз, якщо я хочу в цьому випадку відобразити всі властивості в одному операторі для мого класу "Жанр", я можу використовувати @ Html.DisplayFor () для економії на моєму введенні, принаймні

я можу написати @ Html.DisplayFor (modelItem => item.Genre) замість того, щоб написати окрему заяву для кожного властивості жанру, як показано нижче

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

і так далі, залежно від кількості властивостей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.