Что такое @Html.Синтаксис DisplayFor для?

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

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

зачем мне писать:

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

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

@Model.Title

4 ответов


Html.DisplayFor() отобразит DisplayTemplate, соответствующий типу свойства.

если он не может найти, я полагаю, он вызывает .ToString().


если вы не знаете о шаблонах отображения, это частичные представления, которые можно поместить в DisplayTemplates папка внутри папки представления, связанной с контроллером.


пример:

если вы создаете представление с именем String.cshtml внутри папки видом (напр.г 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 principal, так что вам не нужно снова и снова писать одну и ту же логику отображения для одной и той же модели.

взгляните на этот блог на шаблонах MVC2. Это все еще очень применимо к MVC3:

http://www.dalsoft.co.uk/blog/index.php/2010/04/26/mvc-2-templates/


это также полезно, если ваша модель имеет аннотации данных. Например, если свойство модели украшено символом EmailAddress аннотации данных DisplayFor будет отображаться как mailto: ссылка.


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

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

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