asp.net mvc 3 - update - ¿Para qué sirve la sintaxis de @ Html.DisplayFor?
razor mvc (4)
Creo que el principal beneficio sería cuando define sus propias Plantillas de visualización o utiliza anotaciones de datos.
Así, 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 una manera consistente. De lo contrario, es posible que tenga que personalizar la pantalla en varias páginas. Por lo tanto, no ayuda mucho para cadenas simples, pero sí ayuda para monedas, fechas, correos electrónicos, urls, 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>
Entiendo que en Razor, @Html hace un montón de cosas interesantes, como generar HTML para enlaces, entradas, etc.
Pero no consigo la función DisplayFor ...
¿Por qué escribiría?
@Html.DisplayFor(model => model.Title)
cuando solo pude escribir:
@Model.Title
Después de buscar una respuesta para mí por un tiempo, pude encontrar algo. en general, si lo estamos utilizando para una sola propiedad, aparece igual, incluso si hacemos un "Ver código fuente" del HTML generado. A continuación, se genera un HTML, por ejemplo, cuando quiero mostrar solo la propiedad Nombre para mi clase
<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 del género como se muestra a continuación
@item.Genre.Name
@item.Genre.Id
@item.Genre.Description
y así sucesivamente dependiendo del número de propiedades.
DisplayFor
también es útil para plantillas. Podría 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 principal 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 en 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 anotación de datos EmailAddress
, DisplayFor
lo representará como un enlace mailto:
.
Html.DisplayFor()
renderizará 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 carpeta DisplayTemplates
dentro de la carpeta de vista asociada a un controlador.
Ejemplo:
Si crea una vista llamada String.cshtml
dentro de la carpeta DisplayTemplates
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)
(asumiendo que Title
es una cadena) usará la plantilla y mostrará <strong>Null string</strong>
si la cadena es nula o está vacía.