Для чего нужен синтаксис @ 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 со всех сторон.
Робин Уинслоу
что произойдет, если у вас есть две модели с одинаковым именем?
Халивингстон
77

Я думаю, что основным преимуществом будет то, когда вы определяете свои собственные шаблоны отображения или используете аннотации данных.

Так, например, если ваш заголовок был датой, вы можете определить

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

а затем на каждой странице будет отображаться значение в согласованном порядке. В противном случае вам может потребоваться настроить отображение на нескольких страницах. Так что это не очень помогает для простых строк, но это помогает для валют, дат, электронных писем, URL и т. Д.

Например, вместо адреса электронной почты, являющегося простой строкой, он может отображаться в виде ссылки:

<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>
Daveo
источник
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:ссылка.

vcsjones
источник
8
@Html.DisplayFor(m => m)также может быть упрощен до справедливости @Html.DisplayForModel().
Брант Бобби
Что такое лямда-выражение (m => m)? Что представляет собой первый символ?
Аркадиан
1
первый m это имя параметра
Sinaesthetic
1
@ magic-c0d3r первый m - это объект модели страницы. Вот что используется в выражении labmda
Дон Чидл
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

и так далее в зависимости от количества свойств.

Викас Шарма
источник