2010-01-12 10 views
30

Sto provando a convalidare una classe decorata con annotazione dati con Validator class.Convalida datiAnnotazioni con classe Validator

Funziona correttamente quando gli attributi vengono applicati alla stessa classe. Ma quando provo a usare una classe di metadati non funziona. C'è qualcosa che dovrei fare con il Validator in modo che usi la classe dei metadati? Ecco po 'di codice ..

questo funziona: lavoro

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

questo pretende molto:

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

questo è come mi convalidare le istanze:

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

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

grazie.

+0

non riesco a trovare ValidationContext entro System.ComponentModel.DataAnnotations (MVC 2.0) sto facendo qualcosa di sbagliato? – Myster

+0

@Myster controllare che System.ComponentModel.DataAnnotations.dll sia referenziato nel progetto. – Pablote

+0

Basta usare questo [gist] (https://gist.github.com/JimmyBoh/b7c135820c18a06648a5) (un metodo di estensione) e puoi chiamare p.Validate() –

risposta

41

ho trovato la risposta qui: http://forums.silverlight.net/forums/p/149264/377212.aspx

MVC riconosce l'attributo MetaDataType, ma altri progetti non fanno. Prima di convalidare, è necessario registrare manualmente la classe di metadati:

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

è stato! :) – Pablote

+0

Ho ampliato la mia risposta a una domanda simile qui: http://stackoverflow.com/questions/1755340/validate-data-using-dataannotations-with-wpf-entity-framework/2467387#2467387 –

+0

Il flag 'validateAllProperties' mi ha fatto inciampare Vale la pena ricordare di impostare ciò che è appropriato! – Gusdor

0

Provare a spostare la classe di metadati nello stesso spazio dei nomi della classe Persona se non lo è già. Stavo riscontrando problemi simili e spostando la mia classe di metadati nello stesso spazio dei nomi utilizzato dalla classe del modello L2S.

+1

Non ha funzionato, ho anche provato a mettere la classe dei metadati all'interno della classe, ma senza fortuna. – Pablote

Problemi correlati