2011-06-14 9 views
9

Estoy tratando de poner en práctica Validator.TryValidateProperty ya pesar de que hay una [Obligatorio] DataAnnotation, la TryValidateProperty devuelve una respuesta válida.Validator.TryValidateProperty que no trabaja

Aquí es mi cliente clase parcial:

[MetadataType(typeof(Customer.Metadata))] 
public partial class Customer : global::System.Data.Objects.DataClasses.EntityObject 
{ 
    ... 
private sealed class Metadata 
    { 

     [Required] 
     [SSNValidAttribute(ErrorMessage = "The SSN should be 9 numeric characters without any punctuation.")] 
     [DisplayName("SSN")] 
     public String SSN { get; set; } 
... 

Y aquí es el código que se vuelve verdadera:

... 
var customer = new Customer(); 
      customer.SSN = ""; 
      var vc = new ValidationContext(customer, null, null); 
      vc.MemberName = "SSN"; 
      var res = new List<ValidationResult>(); 
      var result = Validator.TryValidateProperty(customer.SSN, vc, res); 
... 
+0

¿Dónde está la definición de 'SSNValidAttribute'? – mellamokb

+0

@mellamokb, obtuve el mismo comportamiento incluso sin ese atributo, cuando probé el código. – svick

Respuesta

14

Ok, acaba de encontrar la solución para hacer frente a la clase sellada MetadataType.

var customer = new Customer(); 
TypeDescriptor.AddProviderTransparent 
(new AssociatedMetadataTypeTypeDescriptionProvider 
    (customer.GetType()), customer.GetType()); 
customer.SSN = ""; 
var vc = new ValidationContext(customer, null, null); 
vc.MemberName = "SSN"; 
var res = new List<ValidationResult>(); 
var result = Validator.TryValidateProperty(customer.SSN, vc, res); 

he tenido que añadir lo siguiente:

TypeDescriptor.AddProviderTransparent 
(new AssociatedMetadataTypeTypeDescriptionProvider 
    (customer.GetType()), customer.GetType()); 

encontrado solución a esta dirección: http://forums.silverlight.net/forums/p/149264/333396.aspx

+0

Tuve un problema similar con WPF ignorando completamente los metadatos de validación al usar una clase de amigo MetadataType. Como estaba usando POCOs con EF, modifiqué el generador TT para agregar la línea anterior en el constructor estático. –