para mvc labelfor imagen htmlattributes for emplea atributo validation asp.net-mvc-2 attributes

validation - mvc - Preguntándose por qué se ignora el atributo DisplayName en LabelFor en una propiedad anulada



html.labelfor htmlattributes (5)

hoy me confundí al hacer un par de <%=Html.LabelFor(m=>m.MyProperty)%> en ASP.NET MVC 2 y usar el atributo [DisplayName("Show this instead of MyProperty")] del System.ComponentModel .

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 código de ejemplo trivial, el escenario más realista es que tengo un modelo de base de datos separado del modelo de vista, pero para mayor comodidad, me gustaría heredar del modelo de base de datos, agregar propiedades de solo lectura y decorar el modelo de vista con los 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; } }

La página de vista fuertemente tipificada 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 como "PleaseOverrideMe" ( no utilizando DisplayNameAttribute) y "Esta propiedad existe solo en EditModel" ( usando DisplayNameAttribute) al visualizar la página.
Si publico con valores vacíos, activando la validación con este método de acción:

[HttpPost] public ActionResult Edit(EditModel model) { if (!ModelState.IsValid) return View(model); return View("Thanks"); }

el <%= Html.ValidationMessageFor(model => model.PleaseOverrideMe) %> usa realmente el <%= Html.ValidationMessageFor(model => model.PleaseOverrideMe) %> [DisplayName("This should be as label for please override me!")] , y produce el errortexto predeterminado "The This should be as as label" ¡Por favor anúnciame! Se requiere campo. "

¿Algún alma amistosa arrojaría algo de luz sobre esto?



Tuve el mismo problema cuando tenía una vista parcial fuertemente tipada a una interfaz. La interfaz definió DisplayName y la clase que implementó la interfaz intentó anularla. La única forma que encontré para que respetara la anulación fue escribir en la clase de implementación. Tuve que cambiar el tipo de modelo o el molde de la vista. Desafortunadamente, eso niega completamente los beneficios de usar la interfaz como el tipo de modelo. Estoy adivinando que terminaré con un cierto nivel de marcado de vista duplicado para cada clase de implementación, mientras que no se incluirá dentro de los "ayudantes" fuertemente tipados.

En la remota posibilidad de que este tipo de solución sea remotamente útil (no estoy ilusionándome), aquí hay un ejemplo. Ciertamente hay formas de trabajar en esto para todas las posibles clases de implementación que intentan anular un nombre, pero definitivamente es más complicado de lo que debería ser.

public interface IAddressModel { ... [DisplayName("Province")] public string Province { get; set; } ... } public class UsAddressModel : IAddressModel { ... [DisplayName("State")] public string Province { get; set; } ... } <%= Html.LabelFor(m => m.State) %> <!--"Province"--> <%= Html.LabelFor(m => (m as UsAddressModel).State) %> <!--"State"-->


Me encontré con este problema usando [DisplayName ("Nombre de perfil")] y en su lugar usé [Display(Name = "Profile Name")] que solucionó el problema en mi caso. No estoy seguro si esto sería útil.

El primero es de System.ComponentModel mientras que el último es de System.ComponentModel.DataAnnotations .


De acuerdo, parece haber encontrado una solución si no usas la etiqueta requerida con ella. solo use un atributo de longitud o expresión regular para determinar si hay una entrada válida. Espero que esto ayude, aunque es un poco tarde.

[RegularExpression(@"^[1-9][0-9][0-9]$")] //validates that there is at least 1 in the quantity and no more than 999 [DisplayName("Quantity:")] public string quantity { get; set; }

Todavía funciona.


En mi caso, se me olvidó convertirlo en una propiedad utilizando getters y setters. En lugar de

public string CompanyName;

Debería haber usado

public string CompanyName {get;set;}