Model

2012-10-08 35 views
5

içinde geçerlilik özniteliklerini devralmayı engelle Başka özel iletişim modelleri sınıfları devraldığı bir temel iletişim modeli kullanıyorum.Model

public class BaseContactModel 
{ 
    [Required(ErrorMessage = "Firstname is required")] 
    public virtual string FirstName { get; set; } 
} 

taban temas modeli doğrulama bir özellik gereklidir bayrağına ama geçersiz kılabilir veya durdurmak istiyoruz bazı durumlarda özelliklerini kullanır. Bu mümkün mü?

public class ContactModel : BaseContactModel 
{ 
    [NotRequired] 
    public override string FirstName { get; set; } 
} 

ben sadece doğru dönmek notRequired yeni doğrulama özelliğini kullanmayı denedi, ama nitelikleri sadece çalışan yüzden Gerekli & notRequired yığılmış ediliyor görünür ve doğrulama başarısız oluyor.

bazı alakasız nitelikler bir 'miras' özelliğine sahip olduğu bulunmuştur (bulamadım olan) çözümleri arayanlar On

ama yerli doğrulama bu görmüyorum System.ComponentModel.DataAnnotations yılında bağlıyor.

Bu bir kayıp neden mi? Devralmayı devre dışı bırakmayı destekleyen kendi sürümlerimi mi çıkarmam gerekiyor? Herhangi bir yardım büyük beğeni topluyor.

cevap

2

istediğiniz durumda olabilir sonra her örneği birini valide . Gördüğüm kadarıyla, her ikisi de temel özelliklerini kullanır.

Doğrulama rutini hakkında açıklık sağlamak için bir kontrol sınıfı ControlModel ekledim.

class Program 
{ 
    static void Main(string[] args) 
    { 
     ValidationTest<Model>(); 
     ValidationTest<BaseModel>(); 
     ValidationTest<ControlModel>(); 

     Console.Read(); 
    } 

    private static void WriteAttributeInfo<T>() 
    { 
     Console.WriteLine(string.Concat(typeof(T), " attributes:")); 
     typeof(T).GetProperties().SelectMany(m => m.GetCustomAttributes(true)).Select(a => { Console.WriteLine(a); return a; }).ToList(); 
    } 

    private static void ValidationTest<T>() 
    { 
     object obj = Activator.CreateInstance<T>(); 
     Console.WriteLine(string.Concat(typeof(T), " test: isValid = ", Validator.TryValidateObject(obj, new ValidationContext(obj, serviceProvider: null, items: null), new List<ValidationResult>()))); 
    } 
} 

class ControlModel 
{ 
    public string FirstName { get; set; } 

    public string Email { get; set; } 
} 

class BaseModel 
{ 
    [RequiredAttribute] 
    public virtual string FirstName { get; set; } 

    [RequiredAttribute] 
    public virtual string Email { get; set; } 
} 

class Model : BaseModel 
{ 
    public new string FirstName { get; set; } 

    public new string Email { get; set; } 
} 

ConsoleApplication1.Model testi: isValid = False

ConsoleApplication1.BaseModel testi: isValid = False

ConsoleApplication1.ControlModel testi: isValid = Gerçek

itibaren Bu örnekte, devralınan gerekli validatio'yu geçersiz kılmayacak/gizleyemezsiniz n (henüz başkalarını denemedim) öznitelikleri.

+0

Kendi sorularıma cevap vermekten ve kabul etmekten nefret ediyorum, ancak yukarıdaki testte, sorulması gereken asıl soru, –

+0

Gerçekten bunun için bir çözüm değil mi? – Giorgio

0

Bu da başka BaseModel devraldığı Model, yeni bir anahtar kelime kullandığı bu aşağıda, ben oluşturduk tek sınıfına bakın aslında yeni bir özellik

public class ContactModel : BaseContactModel 
{ 
     [NotRequired] 
     public new string FirstName { get; set; } 
} 
+1

Bu, öznitelikleri değiştiriyor mu? Yeni (sanal bir özellik ile) kullanmayı denedim, ancak yine de onaylamaya varacak gibi görünüyor. –

+0

Bu stratejiyi geçmişte birkaç kez kullandım. Yepyeni bir özellik olmalı, bu nedenle yalnızca bir doğrulama özelliği veya diğeri ateşlenmelidir. Elbette, hangi özelliğin kullanıldığını belirlemek için model değişkeninizi nasıl beyan ettiğinizi veya kullandığınızı belirler. Çalışmıyorsa, neden olduğunu anlayabileceğimizi görmek için bazı denetleyici kodu göndermek isteyebilirsiniz. – dumdum

+0

Cevabınız için teşekkür ederiz, bu akşam başka bir çaba harcayacağım ve hatta bir kutudan çıkıp bir siteyi deneyebilirsiniz. –