2011-12-17 13 views
9

Estoy intentando validar objetos anidados (no modelos en los MVC sens) usando anotaciones y algunos códigos personalizados.Validación recursiva usando anotaciones y IValidatableObject

me encontré con el siguiente post útil

Using Data Annotations Validation Manually and Object Graphs

Como se sugiere en una respuesta, he creado una rutina adicional en la clase de contenedor para validar el objeto anidado. Aquí está mi código de prueba modificado

public class Customer : IValidatableObject 
{ 
    public Customer() 
    { 
     Details = new CustomerDetails(); 
    } 

    [Required] 
    [MaxLength(2)] 
    public string Name 
    { 
     get; 
     set; 
    } 

    public CustomerDetails Details 
    { 
     get; 
     private set; 
    } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var context = new ValidationContext(this.Details, validationContext.ServiceContainer, validationContext.Items); 
     var results = new List<ValidationResult>(); 
     Validator.TryValidateObject(this.Details, context, results); 
     return results; 
    } 
} 

Sin embargo tengo problemas para conseguir todos los errores de validación, incluso cuando se llama a TryValidateObject con validateAllProperties establecidas en true.

 var context = new ValidationContext(cs, null, null); 
     var results = new List<ValidationResult>(); 
     Validator.TryValidateObject(cs, context, results,true); 

Si hay algún error en el contenedor, solo se mostrarán. Solo cuando no haya errores en el objeto contenedor, se mostrarán los errores en el objeto anidado. Sospecho que tiene algo que ver con Validate Rouine devolviendo una lista completa, y no pudiendo agregar a una lista (existente) desde el contenedor (?)

¿Hay alguna modificación que pueda hacer en la rutina para obtener todo errores para mostrar?

Respuesta

5

Ver esta respuesta: https://stackoverflow.com/a/3400627/724944

Por lo tanto, hay un error en los atributos de clase, y por lo tanto el método Validar no consigue llamado. sugiere emplear CustomValidationAttribute así:

[CustomValidation(typeof(Customer), "ValidateRelatedObject")] 
public CustomerDetails Details 
{ 
    get; 
    private set; 
} 

public static ValidationResult ValidateRelatedObject(object value, ValidationContext context) 
{ 
    var context = new ValidationContext(value, validationContext.ServiceContainer, validationContext.Items); 
    var results = new List<ValidationResult>(); 
    Validator.TryValidateObject(value, context, results); 

    // TODO: Wrap or parse multiple ValidationResult's into one ValidationResult 

    return result; 

} 
+0

, si he entendido bien, "validateAllProperties" sólo afectará a las propiedades anotadas, no una rutina separada Validar Ok? Pero intenté implementar tu rutina, pero tengo problemas con lo que dejaste como TODO. Como ValidateRelatedObject devuelve un solo ValidationResult, (para una sola propiedad anotada), ¿cómo puedo hacer que envíe una posible lista de errores (desde el objeto anidado) a la lista de posibles errores de los objetos del contenedor? El ejemplo original parecía más prometedor a este respecto ya que devolvía una lista. ¡Su ayuda es muy apreciada! – goorj

+0

En mi proyecto simplemente enumero todos los errores ValidationResult y Merge en una cadena, separados por una nueva línea. Más tarde, cuando necesito usarlo, simplemente dividí el error en varias líneas. También podría considerar la creación de una clase como MultiValidationResult que almacenará el ValidationResult real y expondrá el error concatenado. – surfen

Cuestiones relacionadas