Pregunta Validación de anotaciones de datos con la clase Validator


Estoy tratando de validar una clase decorada con anotación de datos con Clase validadora.

Funciona bien cuando los atributos se aplican a la misma clase. Pero cuando trato de usar una clase de metadatos, no funciona. ¿Hay algo que deba hacer con el Validator para que use la clase de metadatos? Aquí hay un código ...

esto funciona:

public class Persona
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "El nombre es obligatorio")]
    public string Nombre { get; set; }

    [Range(0, int.MaxValue, ErrorMessage="La edad no puede ser negativa")]
    public int Edad { get; set; }
}

esto no funciona:

[MetadataType(typeof(Persona_Validation))]
public class Persona
{
    public string Nombre { get; set; }
    public int Edad { get; set; }
}

public class Persona_Validation
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "El nombre es obligatorio")]
    public string Nombre { get; set; }

    [Range(0, int.MaxValue, ErrorMessage = "La edad no puede ser negativa")]
    public int Edad { get; set; }
}

así es como valido las instancias:

ValidationContext context = new ValidationContext(p, null, null);
List<ValidationResult> results = new List<ValidationResult>();

bool valid = Validator.TryValidateObject(p, context, results, true);

Gracias.


32
2018-01-12 15:45


origen


Respuestas:


Encontré la respuesta aquí: http://forums.silverlight.net/forums/p/149264/377212.aspx

MVC reconoce el atributo MetaDataType, pero otros proyectos no lo hacen. Antes de validar, necesita registrar manualmente la clase de metadatos:

TypeDescriptor.AddProviderTransparent(
            new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Persona), typeof(Persona_Validation)), typeof(Persona));

ValidationContext context = new ValidationContext(p, null, null);
List<ValidationResult> results = new List<ValidationResult>();

bool valid = Validator.TryValidateObject(p, context, results, true);

43
2018-03-18 03:19



Intente mover la clase de metadatos al mismo espacio de nombres que la clase Persona si no lo está. Estaba teniendo problemas similares y moviendo mi clase de metadatos al mismo espacio de nombres que la clase de modelo L2S me funcionó.


-1
2018-01-26 17:22