8

, bu basit sınıfı:Doğrulama kullanarak nitelikleri

public class User 
{ 
    [Required(AllowEmptyStrings = false, ErrorMessage="EmailIsRequired"] 
    public string EmailAddress { get; set; } 
} 

Ben System.ComponentModel.DataAnnotations ad Validator.TryValidateProperty ve Validator.TryValidateObject nasıl kullanacağımı biliyorum. Bunun çalışması için, doğrulamak istediğiniz nesnenin gerçek bir örneğine ihtiyacınız vardır.

Ama şimdi, ben gibi, Kullanıcı sınıfının bir örneği olmadan belirli bir değeri doğrulamak istiyorum:

TryValidateValue(typeof(User), "EmailAddress", "[email protected]"); 

gol aslında (nesnenin kendisini örneğini zorunda kalmadan önce bir değeri test etmek istediğiniz olmasıdır nedeni, yalnızca geçerli etki alanı varlıklarının oluşturulmasına izin vermekti). Yani aslında örnek yerine sınıflar üzerinde doğrulama öznitelikleri kullanmak istiyorum.

Bunun nasıl yapılabileceği hakkında bir fikrin var mı?

Teşekkürler!

DÜZENLEME: bu arada veri ek açıklamalarını kullanmamaya karar verdim, ancak bunun yerine geçerlilik, varlıkların dışına taşınacak şekilde http://fluentvalidation.codeplex.com kullanın. Bu şekilde, doğrulama, tarafların yanı sıra komut işleyicilerim arasında da tetiklenebilir. Doğrulama, akıcı notasyon sayesinde daha okunabilir görünüyor.

+0

? Nesnenin çok fazla şey yapması mümkündür ve eğer yapıcıyı çağırmak bir şeyleri mahvedecekse, sorumluluklarını bölmeliydin. –

+0

Etki alanı, yapıcısındaki tüm alanları denetliyor, bunlardan herhangi biri doğrulanmıyorsa, bir istisna atılıyor, böylece nesne oluşturulamıyor. Ama şimdi, benim komut işleyicimde, bağlamsal doğrulama için bir e-posta adresini doğrulamam gerekiyor, ancak nesnenin kendisine ihtiyacım yok. Bu yüzden merak ettim: Bu nesnenin bir örneğine ihtiyaç duymadan neden bu e-posta doğrulamasını yeniden kullanamıyorum. Doğrulamayı tamamen varlıktan kaldırabilirim, ancak veri ek açıklamalarını kullanamıyorum sanırım ... –

+0

Özel türetilmiş ek açıklamalar oluşturmanın bir yolu var mı? Daha sonra, ek açıklama ile bu komut işleyicisi arasındaki doğrulama uygulamasını paylaşabilirsiniz. Bu bir tür korsanlık olurdu, ancak şahsen ben ek açıklamaların alan kısıtlaması doğrulaması için tam veya mükemmel bir şekilde faktörlü bir mimari çözüm olmadığına inanıyorum (çapraz-mülk kısıtlamalarını kaldıramıyorlar ve bir sınıfa uygulanmışlarsa zenginleri desteklemeyin) mantık), böylece elinizde olanla en iyisini yapıyor olacaksınız. –

cevap

16

Burada TryValidateValue yöntemi kullanmak nasıl bir örnek:

Sen geçersiz oldukları takdirde alanı nesneleri başlatmasını önlemek için çalışıyoruz, ancak bunu başlatmasını etkisi nedir belirtti
public class User 
{ 
    [Required(AllowEmptyStrings = false, ErrorMessage = "EmailIsRequired")] 
    public string EmailAddress { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var value = "[email protected]"; 

     var context = new ValidationContext(value, null, null);   
     var results = new List<ValidationResult>(); 
     var attributes = typeof(User) 
      .GetProperty("EmailAddress") 
      .GetCustomAttributes(false) 
      .OfType<ValidationAttribute>() 
      .ToArray(); 

     if (!Validator.TryValidateValue(value, context, results, attributes)) 
     { 
      foreach (var result in results) 
      { 
       Console.WriteLine(result.ErrorMessage); 
      } 
     } 
     else 
     { 
      Console.WriteLine("{0} is valid", value); 
     } 
    } 
} 
İlgili konular