Что такое синтаксис @Html.DisplayFor?

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

Но я не получаю функцию DisplayFor...

Зачем писать:

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

когда я мог просто написать:

@Model.Title

Ответ 1

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>, если строка равна null или пустой.

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Ответ 4

После того как я искал ответ для себя некоторое время, я мог найти что-то. в общем случае, если мы используем его только для одного свойства, оно кажется таким же, даже если мы делаем "View Source" сгенерированного 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

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