2010-01-12 7 views
30

Próbuję sprawdzić klasę ozdobioną adnotacjami danych za pomocą Validator class.Sprawdzanie poprawności atrybutów danych za pomocą klasy Validator

Działa poprawnie, gdy atrybuty są stosowane do tej samej klasy. Ale kiedy próbuję użyć klasy metadanych, to nie działa. Czy jest coś, co powinienem zrobić z Validatorem, więc używa klasy metadanych? Oto niektóre kodu ..

to działa: praca

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

to robi:

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

to jak mogę zweryfikować instancje:

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

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

dzięki.

+0

nie mogę znaleźć ValidationContext ciągu System.ComponentModel.DataAnnotations (MVC 2.0) robię coś źle? – Myster

+0

@Myster sprawdź, czy odwołuje się do pliku System.ComponentModel.DataAnnotations.dll w projekcie. – Pablote

+0

Po prostu użyj tego [gist] (https://gist.github.com/JimmyBoh/b7c135820c18a06648a5) (metoda rozszerzenia) i możesz wywołać p.Validate() –

Odpowiedz

41

Znalazłem odpowiedź tutaj: http://forums.silverlight.net/forums/p/149264/377212.aspx

MVC rozpoznaje atrybut MetaDataType, ale inne projekty nie. Przed zatwierdzeniem, trzeba ręcznie zarejestrować klasę metadanych:

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

to było to! :) – Pablote

+0

Rozszerzyłem moją odpowiedź na podobne pytanie tutaj: http://stackoverflow.com/questions/1755340/validate-data-using-dataannotations-with-wpf-entity-framework/2467387#2467387 –

+0

Flaga 'validateAllProperties' potknął mnie. Warto o tym pamiętać, jeśli zajdzie taka potrzeba! – Gusdor

0

Spróbuj przenieść klasę metadanych do tej samej przestrzeni nazw co klasa Persona, jeśli jeszcze jej nie ma. Miałem podobne problemy i przeniesienie mojej klasy metadanych do tej samej przestrzeni nazw co klasa modelu L2S, która działała dla mnie.

+1

To nie działało, próbowałem także wstawić klasę metadanych w klasie, ale bez powodzenia. – Pablote