2010-01-12 15 views
30

Estoy intentando validar una clase decorada con anotación de datos con el Validator class.Validación de datosAnotaciones con Validador clase

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 algo de código ..

funciona esto: el trabajo

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

ésto no:

[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 puedo validar los casos:

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

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

gracias.

+0

No puedo encontrar ValidationContext dentro System.ComponentModel.DataAnnotations (MVC 2.0) estoy haciendo algo mal? – Myster

+0

@Myster comprobar que System.ComponentModel.DataAnnotations.dll se hace referencia en el proyecto. – Pablote

+0

Simplemente use esto [gist] (https://gist.github.com/JimmyBoh/b7c135820c18a06648a5) (un método de extensión) y puede llamar a p.Validate() –

Respuesta

41

he encontrado la respuesta aquí: http://forums.silverlight.net/forums/p/149264/377212.aspx

MVC reconoce el atributo MetadataType, pero otros proyectos no. Antes de validar, es necesario 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); 
+2

eso fue todo! :) – Pablote

+0

Expandí mi respuesta a una pregunta similar aquí: http://stackoverflow.com/questions/1755340/validate-data-using-dataannotations-with-wpf-entity-framework/2467387#2467387 –

+0

La bandera 'validateAllProperties' me hizo tropezar. ¡Vale la pena recordar establecer eso donde sea apropiado! – Gusdor

0

Intenta 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

No funcionó, también intenté poner la clase de metadatos dentro de la clase, pero sin suerte. – Pablote

Cuestiones relacionadas