2011-01-23 14 views
8

Aquí está mi clase de prueba con anotaciones de datos:StringLengthAttribute no parece estar funcionando

class Test 
{ 
    [Required, StringLength(10)] 
    public string MyProperty { get; set; } 
} 

Aquí es mi programa de pruebas de la consola:

class Program 
{ 
    static void Main(string[] args) 
    { 
    var test = new Test { 
     MyProperty = "this is way more than 10 characters and should fail." 
    }; 

    var context = new ValidationContext(test, null, null); 

    // No exception here! (why not?) 
    Validator.ValidateObject(test, context); 

    test.MyProperty = null; 

    // Exception here, as expected 
    Validator.ValidateObject(test, context); 
    } 
} 

Por alguna razón, no consigo una excepción de validación cuando la longitud de la cadena es demasiado larga. Obtengo una excepción de validación (como se esperaba) cuando establezco la propiedad en nulo y valide nuevamente. ¿Alguna idea de por qué mi anotación de longitud de cadena no se está aplicando?

Respuesta

19

Es un poco no intuitivo, pero cambiando

Validator.ValidateObject(test, context); 

a

Validator.ValidateObject(test, context, true); 

resuelve el problema. El tercer argumento es bool validateAllProperties. No estoy seguro de por qué el atributo [Required] se aplicaba anteriormente, mientras que el [StringLength] no, pero al menos todo funciona ahora.

3

Gracias por publicar esto. Publiqué un error en Microsoft Connect para este problema. Supongo que están salteando incorrectamente una propiedad System.String ya que no es un tipo de valor porque no hacen una validación profunda/recursiva sin el parámetro "validateAllProperties".

Aquí está el enlace para insectos si está interesado: https://connect.microsoft.com/VisualStudio/feedback/details/672247/system-componentmodel-dataannotations-validator-does-not-validate-stringlengthattribute-unless-validateallproperties-specified

Cuestiones relacionadas