¿Para qué sirve la sintaxis @ Html.DisplayFor?

223

Entiendo que en Razor, @Html hace un montón de cosas interesantes, como generar HTML para enlaces, entradas, etc.

Pero no obtengo la función DisplayFor ...

¿Por qué debería escribir:

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

cuando solo podía escribir:

@Model.Title
Michael Pryor
fuente

Respuestas:

217

Html.DisplayFor() mostrará el DisplayTemplate que coincida con el tipo de propiedad.

Si no puede encontrar ninguno, supongo que invoca .ToString().


Si no conoce las plantillas de visualización, son vistas parciales que se pueden colocar en una DisplayTemplatescarpeta dentro de la carpeta de vista asociada a un controlador.


Ejemplo:

Si crea una vista nombrada String.cshtmldentro de la DisplayTemplatescarpeta de su carpeta de vistas (por ejemplo Home, o Shared) con el siguiente código:

@model string

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

Luego @Html.DisplayFor(model => model.Title)(suponiendo que Titlees una cadena) usará la plantilla y mostrará <strong>Null string</strong>si la cadena es nula o está vacía.

Bertrand Marron
fuente
66
Me parece inútil, en la mayoría de los casos, usar DisplayFor para tipos primitivos. Por ejemplo, DateTime mostraría la fecha / hora incluso si la parte de la hora fuera inútil. Si pudiera especificar una cadena de formato de "{0: d}" para un tipo DateTime en los atributos de la propiedad en el Modelo, DisplayFor podría ser más útil.
enorl76
66
@ enorl76 puedes. Ver la respuesta de Daveo .
Bertrand Marron
3
Puede agregar un selector de fecha jQuery a la plantilla EditorFor para un tipo de datos DateTime para mostrar siempre un selector de fecha en formularios, por ejemplo.
Zachary Scott
44
Me parece que es una ingeniería excesiva usarlo en general, pero que debería usarlo cuando desee formatear la salida para ciertos atributos del modelo. Útiles preguntas y respuestas chicos, gracias. + 1s todo el año.
Robin Winslow
¿Qué pasa si tienes dos modelos con el mismo nombre?
Halivingston
77

Creo que el principal beneficio sería cuando defina sus propias plantillas de visualización o utilice anotaciones de datos.

Entonces, por ejemplo, si su título era una fecha, podría definir

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

y luego en cada página mostraría el valor de manera consistente. De lo contrario, puede que tenga que personalizar la pantalla en varias páginas. Por lo tanto, no ayuda mucho para cadenas simples, pero ayuda para monedas, fechas, correos electrónicos, direcciones URL, etc.

Por ejemplo, en lugar de que una dirección de correo electrónico sea una cadena simple, podría aparecer como un enlace:

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

DisplayForTambién es útil para crear plantillas. Puede escribir una plantilla para su Modelo y hacer algo como esto:

@Html.DisplayFor(m => m)

Similar a @Html.EditorFor(m => m). Es útil para el director DRY para que no tenga que escribir la misma lógica de visualización una y otra vez para el mismo Modelo.

Echa un vistazo a este blog sobre plantillas MVC2. Todavía es muy aplicable a MVC3:

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


También es útil si su modelo tiene una anotación de datos. Por ejemplo, si la propiedad en el modelo está decorada con la EmailAddressanotación de datos, la DisplayForrepresentará como un mailto:enlace.

vcsjones
fuente
8
@Html.DisplayFor(m => m)También se puede simplificar a justo @Html.DisplayForModel().
Brant Bobby
¿Cuál es la expresión de lamda (m => m)? ¿Cuál es la primera m representa?
Arcadian
1
la primera m es el nombre del parámetro
Sinaesthetic
1
@ magic-c0d3r la primera m es el objeto Modelo de la página. Eso es lo que se usa en la expresión labmda
Don Cheadle
4

Después de buscar una respuesta para mí por un tiempo, pude encontrar algo. en general, si lo estamos usando solo para una propiedad, parece lo mismo, incluso si hacemos un "Ver código fuente" del HTML generado

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

Este es el HTML generado a partir del siguiente código

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

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

Al mismo tiempo, ahora si quiero mostrar todas las propiedades en una declaración para mi clase "Género" en este caso, puedo usar @ Html.DisplayFor () para guardar en mi escritura, por lo menos

Puedo escribir @ Html.DisplayFor (modelItem => item.Genre) en lugar de escribir una declaración separada para cada propiedad de Genre como se muestra a continuación

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

y así sucesivamente dependiendo del número de propiedades.

Vikas Sharma
fuente