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