Для чего нужен синтаксис @ Html.DisplayFor? - PullRequest
218 голосов
/ 16 июня 2011

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

Но у меня нет функции DisplayFor ...

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

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

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

@Model.Title

Ответы [ 4 ]

209 голосов
/ 16 июня 2011

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

73 голосов
/ 16 июня 2011

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

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

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

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

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

<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>
28 голосов
/ 16 июня 2011

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 голосов
/ 03 ноября 2014

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

и т. Д. В зависимости от количества объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...