2010-08-24 8 views
18

que tienen algo como esto:cómo poner DisplayName en formato ErrorMessage

[DisplayName("First Name")] 
    [Required(ErrorMessage="{0} is required.")] 
    [StringLength(50, MinimumLength = 10, ErrorMessage="{0}'s length should be between {2} and {1}.")] 
    public string Name { get; set; } 

Quiero tener el siguiente resultado: se requiere

  • Nombre. longitud
  • Primera del nombre debe estar entre 10 y 50.

Se está trabajando al utilizar ASP.NET MVC2 error Resumen, pero cuando intento de validar de forma manual, como esto:

 ValidationContext context = new ValidationContext(myModel, null, null); 
     List<ValidationResult> results = new List<ValidationResult>(); 
     bool valid = Validator.TryValidateObject(myModel, context, results, true); 

Los resultados son:

  • El nombre es obligatorio. longitud
  • de nombre debe estar entre 10 y 50.

¿Qué pasa? Gracias.

+0

I parecen tener el mismo problema que la OP. En general, usar [DisplayName] o [Display] en la propiedad funciona correctamente (reemplace {0} en el mensaje de error del atributo requerido con el nombre para mostrar); sin embargo, descubrí que los errores del modelo generados por la validación del lado del servidor ser incorrecto (reemplace {0} con el nombre de la propiedad) - a pesar de que la validación no intrusiva proporciona el valor correcto para la misma propiedad. (Para ver esto tuve que desactivar javascript). Todavía no he podido llegar al fondo de esto, observado con MVC 5.2.3 –

Respuesta

9

Bueno, creo que lo hice.

tuve que crear otro atributo como esto:

public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{ 
    private String displayName; 

    public RequiredAttribute() 
    { 
     this.ErrorMessage = "{0} is required"; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var attributes = validationContext.ObjectType.GetProperty(validationContext.MemberName).GetCustomAttributes(typeof(DisplayNameAttribute), true); 
     if (attributes != null) 
      this.displayName = (attributes[0] as DisplayNameAttribute).DisplayName; 
     else 
      this.displayName = validationContext.DisplayName; 

     return base.IsValid(value, validationContext); 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(this.ErrorMessageString, displayName); 
    } 
} 

Y mi modelo es:

[DisplayName("Full name")] 
    [Required] 
    public string Name { get; set; } 

Afortunadamente esto DataAnnotation es extensible.

+1

Esto cambia el comportamiento de cómo se procesan las etiquetas requeridas. Trataré de realizar un seguimiento con una solución que no afecte la forma en que el marco de la entidad valida al cliente cuando tengo más tiempo para verificar que cumpla con la necesidad inicial de esta pregunta. –

28

En lugar de (o quizás en conjunción con) mediante el atributo [DisplayName], utilizar el atributo [Display] en System.ComponentModel.DataAnnotations. Complete su propiedad Name.

Con esto, se puede utilizar la validación de una función de atributos o atributos personalizados con ValidationContext 's DisplayName.

por ejemplo,

[Display(Name="First Name")] // <-- Here 
[Required(ErrorMessage="{0} is required.")] 
[StringLength(50, MinimumLength = 10, ErrorMessage="{0}'s length should be between {2} and {1}.")] 
public string Name { get; set; } 
+0

Excelente ... me salvaste el día. ¿De dónde sacaste esta información, por favor? – developer

+1

Lo siento, no tengo recuerdos. [Fuente amnesia] (https://en.wikipedia.org/wiki/Source_amnesia) ataca nuevamente. No obstante, puedo decir con gran confianza que no lo leí de la documentación de MSDN. – Sorensen

Cuestiones relacionadas