2011-04-12 6 views
11

que tienen una clase personalizada (para ser simple):Validator.ValidateObject con "validateAllProperties" a cierto parada en primer error

using System; 
using System.ComponentModel.DataAnnotations; 

public class MyClass { 
    [Required] 
    public string Title { get; set;} 
    [Required] 
    public string Description { get; set;} 
} 

que desea validar este objeto, y obtener una excepción con todo lo que no es correcto.

Si hago:

void Validate() { 
    var objectToValidate = new MyClass { }; // Both properties are null at this time 
    var ctx = new ValidationContext(objectToValidate, null, null); 
    Validator.ValidateObject(objectToValidate, ctx, true); 
} 

Un ValidationException se lanza pero muestra sólo el primer error, incluso especifico cierto que el parámetro validateAllProperties.

si refactorizar un poco mi código:

void Validate() { 
    var objectToValidate = new MyClass { }; // Both properties are null at this time 
    var ctx = new ValidationContext(objectToValidate, null, null); 
    var errors = new List<ValidationErrors>(); 
    var isValid = Validator.TryValidateObject(objectToValidate, ctx, errors, true); 

    if(!isValid) { 
     throw new AggregateException(
      errors.Select((e)=>new ValidationException(e.ErrorMessage) 
     ); 
    } 
} 

realidad puedo tener todos mis errores.

¿Por qué funciona el primer fragmento de código como se esperaba? ¿Hice algo mal?

THX

+1

Gracias por el código. La clase ValidationErrors debe ser ValidationResult. – WhiteKnight

Respuesta

12

Validator.ValidateObject pasa a través de todos los atributos de validación y lanza ValidationException para el primero que falla. No creo que uno pueda obtener la lista de todas las propiedades que fallaron de esta manera.

La documentación de MSDN es un poco confuso aquí, que dice:

El método ValidateObject evalúa cada atributo ValidationAttribute que está asociada con el tipo de objeto. Si validateAllProperties se establece en verdadero, el método valida los valores de propiedad del objeto.

TryValidateObject manual de método continúa:

También comprueba si se proporciona cada propiedad que está marcado con RequiredAttribute.

Confirmo que siempre comprueba todos los atributos requeridos, independientemente de validateAllProperties. Pero si tiene, por ejemplo, un atributo de validación de rango, solo lo comprobará cuando validateAllProperties sea verdadero (porque es cuando el valida el valor de propiedad). Un poco confuso, pero como ha notado, TryValidateObject muestra todas las propiedades fallidas y esto es lo que estoy usando para mi proyecto también.

+0

gracias por sus explicaciones ... en realidad es confuso y el nombre del parámetro no es explícito. Mantendré mi excepción global ... no es un gran problema para mí :) –

Cuestiones relacionadas