hoy me confundí al hacer un par de <%=Html.LabelFor(m=>m.MyProperty)%>
en ASP.NET MVC 2 y usando el atributo [DisplayName("Show this instead of MyProperty")]
de System.ComponentModel
.preguntándose por qué el atributo DisplayName se ignora en LabelFor en una propiedad anulada
Al final resultó que, cuando puse el atributo en una propiedad anulada, LabelFor no pareció notarlo.
Sin embargo, el atributo [Required]
funciona bien en la propiedad anulada, y el mensaje de error generado realmente usa DisplayNameAttribute.
Este es un ejemplo de código trivial, el escenario más realista es que tengo un modelo de base de datos separado del modelo de vista, pero por conveniencia, me gustaría heredar del modelo de base de datos, agregar propiedades de solo visualización y decorar el modelo de vista con el atributos para la interfaz de usuario.
public class POCOWithoutDataAnnotations
{
public virtual string PleaseOverrideMe { get; set; }
}
public class EditModel : POCOWithoutDataAnnotations
{
[Required]
[DisplayName("This should be as label for please override me!")]
public override string PleaseOverrideMe
{
get { return base.PleaseOverrideMe; }
set { base.PleaseOverrideMe = value; }
}
[Required]
[DisplayName("This property exists only in EditModel")]
public string NonOverriddenProp { get; set; }
}
El establecimiento inflexible ViewPage<EditModel>
contiene:
<div class="editor-label">
<%= Html.LabelFor(model => model.PleaseOverrideMe) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.PleaseOverrideMe) %>
<%= Html.ValidationMessageFor(model => model.PleaseOverrideMe) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.NonOverriddenProp) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.NonOverriddenProp) %>
<%= Html.ValidationMessageFor(model => model.NonOverriddenProp) %>
</div>
Las etiquetas se muestran entonces como "PleaseOverrideMe" (no utilizando el DisplayNameAttribute) y "esta propiedad existe sólo en EditModel" (utilizando DisplayNameAttribute) al visualizar la página.
Si publico con valores vacíos, lo que provocó la validación con este ActionMethod:
[HttpPost]
public ActionResult Edit(EditModel model)
{
if (!ModelState.IsValid)
return View(model);
return View("Thanks");
}
la <%= Html.ValidationMessageFor(model => model.PleaseOverrideMe) %>
realidad utiliza [DisplayName("This should be as label for please override me!")]
atributo, y produce el defecto ErrorText "The Esta debe ser tan etiqueta para por favor me anular campo es! necesario."
¿Algún alma amistosa arrojará algo de luz sobre esto?
Lasse, ¿ha tenido un poco de suerte en el ínterin? –
Si está utilizando el reflejo para mostrar todas sus propiedades, tiene el tipo 'ModelMetadata' disponible para usted. Básicamente, harías esto 'Html.Label (prop.GetDisplayName())'. –