validar mvc formulario dataannotations data custom campos annotation c# .net validation .net-4.0 data-annotations

c# - mvc - Validación de anotaciones de datos con la clase Validator



modelstate (2)

Estoy intentando validar una clase decorada con anotación de datos con la clase Validator .

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.


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);


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ó.