2010-01-12 2 views
30

Ich versuche, eine Klasse mit Daten Annotation mit der Validator class zu validieren.Validierung von DataAnnotations mit Validator-Klasse

Es funktioniert gut, wenn die Attribute auf die gleiche Klasse angewendet werden. Aber wenn ich versuche, eine Metadatenklasse zu verwenden, funktioniert es nicht. Was sollte ich mit dem Validator tun, damit er die Metadatenklasse verwendet? Hier einige Code ..

dies funktioniert:

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

dies nicht funktioniert:

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

das ist, wie ich die Instanzen bestätigen:

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

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

Dank.

+0

kann ich nicht finden ValidationContext innerhalb System.ComponentModel.DataAnnotations (MVC 2.0) Mache ich etwas falsch? – Myster

+0

@Myster überprüfen, dass System.ComponentModel.DataAnnotations.dll im Projekt referenziert wird. – Pablote

+0

Verwenden Sie einfach [gist] (https://gist.github.com/JimmyBoh/b7c135820c18a06648a5) (eine Erweiterungsmethode) und Sie können p.Validate() –

Antwort

41

fand ich die Antwort hier: http://forums.silverlight.net/forums/p/149264/377212.aspx

MVC erkennt das MetadataType Attribut, aber auch andere Projekte nicht. Bevor die Validierung, müssen Sie manuell die Metadatenklasse registrieren:

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

das war es! :) – Pablote

+0

Ich erweiterte auf meine Antwort auf ähnliche Frage hier: http://stackoverflow.com/questions/1755340/validate-data-using-dataannotations-with-wpf-entity-framework/2467387#2467387 –

+0

Die 'validateAllProperties' Flag hat mich gestolpert. Es lohnt sich, daran zu denken, das zu setzen, wo es angebracht ist! – Gusdor

0

Versuchen Sie, die Metadatenklasse in denselben Namespace wie die Persona-Klasse zu verschieben, wenn dies nicht bereits der Fall ist. Ich hatte ähnliche Probleme und habe meine Metadaten-Klasse in denselben Namensraum verschoben, in dem die L2S-Modellklasse für mich arbeitete.

+1

Es funktioniert nicht, ich habe auch versucht, die Metadaten-Klasse in der Klasse, aber kein Glück. – Pablote