Para que serve a sintaxe @ Html.DisplayFor?

223

Eu entendo que no Razor, o @Html faz várias coisas legais, como gerar HTML para links, entradas etc.

Mas eu não recebo a função DisplayFor ...

Por que eu escreveria:

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

quando eu poderia escrever:

@Model.Title
Michael Pryor
fonte

Respostas:

217

Html.DisplayFor() renderizará o DisplayTemplate que corresponde ao tipo da propriedade.

Se não conseguir encontrar, suponho que invoque .ToString().


Se você não conhece os modelos de exibição, são visualizações parciais que podem ser colocadas em uma DisplayTemplatespasta dentro da pasta de visualização associada a um controlador.


Exemplo:

Se você criar uma visualização nomeada String.cshtmldentro da DisplayTemplatespasta da sua pasta de visualizações (por exemplo Home, ou Shared) com o seguinte código:

@model string

@if (string.IsNullOrEmpty(Model)) {
   <strong>Null string</strong>
}
else {
   @Model
}

Então @Html.DisplayFor(model => model.Title)(supondo que Titleseja uma sequência) usará o modelo e será exibido <strong>Null string</strong>se a sequência for nula ou vazia.

Bertrand Marron
fonte
6
Parece-me inútil, na maioria dos casos, usar DisplayFor para tipos primitivos. Por exemplo, DateTime exibirá data / hora, mesmo que a parte da hora fosse inútil. Se você pudesse especificar uma string de formato "{0: d}" para um tipo DateTime nos atributos da propriedade no Model, DisplayFor poderia ser mais útil.
enorl76
6
@ enorl76 você pode. Veja a resposta de Daveo .
Bertrand Marron
3
Você pode adicionar um selecionador de data do jQuery ao modelo EditorFor para um tipo de dados DateTime para mostrar sempre um selecionador de data em formulários, por exemplo.
Zachary Scott
4
Parece-me que é excesso de engenharia usá-lo em geral, mas você deve usá-lo quando quiser formatar a saída para determinados atributos do modelo. Perguntas e respostas úteis, obrigado. Marcam com +1 o tempo todo.
Robin Winslow
o que acontece se você tiver dois modelos com o mesmo nome?
halivingston
77

Acho que o principal benefício seria quando você define seus próprios modelos de exibição ou usa anotações de dados.

Por exemplo, se seu título era uma data, você poderia definir

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

e, em todas as páginas, exibia o valor de maneira consistente. Caso contrário, pode ser necessário personalizar a exibição em várias páginas. Portanto, não ajuda muito em strings simples, mas ajuda em moedas, datas, e-mails, URLs etc.

Por exemplo, em vez de um endereço de email ser uma sequência simples, ele pode aparecer como um link:

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

DisplayFortambém é útil para modelagem. Você pode escrever um modelo para o seu modelo e fazer algo assim:

@Html.DisplayFor(m => m)

Igual a @Html.EditorFor(m => m) . É útil para o principal DRY, para que você não precise escrever a mesma lógica de exibição repetidamente para o mesmo modelo.

Dê uma olhada neste blog sobre modelos MVC2. Ainda é muito aplicável ao MVC3:

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


Também é útil se o seu modelo tiver uma anotação de dados. Por exemplo, se a propriedade no modelo estiver decorada com a EmailAddressanotação de dados, ela DisplayForserá renderizada como um mailto:link.

vcsjones
fonte
8
@Html.DisplayFor(m => m)também pode ser simplificado para apenas @Html.DisplayForModel().
Brant Bobby
Qual é a expressão lamda (m => m)? Qual é o primeiro m representa?
Arcadian
1
o primeiro m é o nome do parâmetro
Sinaesthetic
1
@ magic-c0d3r o primeiro m é o objeto Model da página. Isso é que é utilizado na expressão labmda
Don Cheadle
4

Depois de procurar uma resposta para mim por algum tempo, eu poderia encontrar algo. em geral, se o estivermos usando para apenas uma propriedade, ela aparecerá igual mesmo se fizermos um "View Source" do HTML gerado. Abaixo é gerado o HTML, por exemplo, quando eu quero exibir apenas a propriedade Name da minha classe

    <td>
    myClassNameProperty
    </td>
   <td>
    myClassNameProperty, This is direct from Item
    </td>

Este é o HTML gerado a partir do código abaixo

<td>
@Html.DisplayFor(modelItem=>item.Genre.Name)            
</td>

<td>
@item.Genre.Name, This is direct from Item
</td>

Ao mesmo tempo, agora, se eu quiser exibir todas as propriedades em uma instrução da minha classe "Gênero" nesse caso, posso usar @ Html.DisplayFor () para economizar na digitação, pelo menos

Eu posso escrever @ Html.DisplayFor (modelItem => item.Genre) no lugar de escrever uma declaração separada para cada propriedade do Genre como abaixo

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

e assim por diante, dependendo do número de propriedades.

Vikas Sharma
fonte