2011-03-20 11 views
37

Dado el siguiente objeto,Validator.TryValidateObject no valida RangeAttribute

public class Question 
{ 
    [Required] 
    public string QuestionText { get; set; } 

    [Range(1, 5)] 
    public int Difficulty { get; set; }   
} 

Con el siguiente código de validación

ICollection<ValidationResult> results = new List<ValidationResult>(); 
Question question = new Question(); 
ValidationContext ctx = new ValidationContext(question, null, null); 
Validator.TryValidateObject(question, ctx, results); 
// results.Length = 1 

¿Por qué no Rango atributo de crear un error de validación cuando se requiera hace (el valor es 0 obviamente)?

Respuesta

58

Ah por lo que parece que necesito para especificar validateAllProperties = true

Validator.TryValidateObject(question, ctx, results, true); 

cierto lo que me estaba arrojando fue el hecho de que tenía una clase base abstracta con otra propiedad en el mismo y sin validateAllProperties el Validador se detendrá en el primer error de TODAS las superclases también. Por lo tanto, obtendrá un error de validación para cada superclase (en mi caso 2)

+0

No he resuelto esto por mí Tengo miedo ... –

+0

La publicación original tiene casi 3 años, esperaría un cambio en el comportamiento. –

+0

Resultó que mi problema era un poco diferente - http://stackoverflow.com/questions/21111905/validator-tryvalidateobject-does-not-validate-attribute –

18

Validator.TryValidatorObject(instance, validationContext, validationResults) llamadas Validator.TryValidateObject(instance, validationContext, validationResults, validateAllProperties) con validateAllProperties = false.

Cuando validateAllProperties es false, solo se validará RequiredAttribute.

+3

Dios mío, qué lío es esto. Espero que Microsoft entienda que hay algo llamado como la palabra "fácil de usar". –

Cuestiones relacionadas