5

Tenemos una necesidad dentro de nuestra lógica de iterar a través de las propiedades de un modelo para unir automáticamente las propiedades y queremos extender la funcionalidad para incluir las nuevas anotaciones de datos en C# 4.0.¿Cómo llamar a ValidationAttributes manualmente? (DataAnnotations and ModelState)

Por el momento, básicamente iterar sobre cada propiedad cargando en todas las instancias ValidationAttribute y tratando de validar usando la función Validate/IsValid, pero esto no parece funcionar para mí.

A modo de ejemplo, tengo un modelo como:

public class HobbyModel 
{ 
    [Required(AllowEmptyStrings = false, ErrorMessage = "Do not allow empty strings")] 
    [DisplayName("Hobby")] 
    [DataType(DataType.Text)] 
    public string Hobby 
    { 
     get; 
     set; 
    } 
} 

Y el código para comprobar los atributos es:

object[] attributes = propertyInfo.GetCustomAttributes(true); 
TypeConverter typeConverter = 
TypeDescriptor.GetConverter(typeof(ValidationAttribute)); 

bool isValid = false; 
foreach (object attr in attributes) 
{ 
    ValidationAttribute attrib = attr as ValidationAttribute; 

    if (attrib != null) 
    { 
    attrib.Validate(obj, propertyInfo.Name); 
    } 
} 

He depurado el código y el modelo tiene 3 atributos , 2 de los cuales se derivan de ValidationAttribute, pero cuando el código pasa a través de la función Validate (con un valor vacío o nulo) arroja una excepción como se esperaba.

Espero estar haciendo algo tonto, entonces me pregunto si alguien ha usado esta funcionalidad y podría ayudar.

Gracias de antemano, Jamie

Respuesta

3

Esto se debe a que está pasando el objeto de origen al método Validate, en lugar del valor de la propiedad. La siguiente es más probable que funcione como se esperaba (aunque, obviamente, no para propiedades indizadas):

attrib.Validate(propertyInfo.GetValue(obj, null), propertyInfo.Name); 

que sin duda tendrá un tiempo más fácil using the Validator class como Steven suggested, sin embargo.

4

usted hace uso de la clase System.ComponentModel.DataAnnotations.Validator para validar objetos.

+0

Tiene un ejemplo del uso de DataAnnotations 4.0 con ASP.Net MVC 3.0, actualmente estoy usando 3.5 (que puede funcionar o no, estoy actualizando el código de MVC 1.0 a 3) – Jamie

+0

Si no soy Por error, MVC 2 y arriba funcionan con DataAnnotaciones por defecto, por lo que cuando trabaje con MVC 3 no tendrá que llamar al validador manualmente. – Steven

+0

Básicamente, queremos descargar el proceso en un mecanismo separado, por lo que queremos poder autoenlazar y ejecutar la validación manualmente. – Jamie

Cuestiones relacionadas