2012-10-08 14 views
5

में उत्तराधिकारी सत्यापन गुणों को रोकें मैं एक मूल संपर्क मॉडल का उपयोग कर रहा हूं जो अन्य कस्टम संपर्क मॉडल वर्गों का उत्तराधिकारी है।मॉडल

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

आधार संपर्क मॉडल सत्यापन झंडा एक संपत्ति के लिए आवश्यक है करने के लिए, लेकिन कुछ मामलों मैं ओवरराइड या कि बंद करना चाहते हैं में विशेषताओं का उपयोग करता है। क्या यह संभव होगा?

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

मैं एक नया सत्यापन विशेषता NotRequired सिर्फ सच वापस जाने के लिए उपयोग करने के लिए प्रयास किया, लेकिन प्रतीत होता है गुण सिर्फ इसलिए आवश्यक & NotRequired ऊपर खड़ी की जा रही हैं चल रहे हैं और मान्यता विफल हो रहा है।

(जो मैं नहीं पा सके) समाधान की तलाश में मैंने पाया कि कुछ असंबंधित गुण एक 'विरासत में मिला' संपत्ति है पर, लेकिन मैं देशी सत्यापन में इस नहीं दिख रहा है System.ComponentModel.DataAnnotations में जिम्मेदार बताते हैं।

क्या यह एक खो गया कारण है? क्या मुझे अपने खुद के संस्करणों को रोल करने की ज़रूरत है जो अक्षमता को अक्षम करने का समर्थन करेंगे? किसी भी मदद की बहुत सराहना की।

उत्तर

2

चाहते हो सकता है यह एक वर्ग पर क्लिक करके मेरे द्वारा बनाए गए Model है कि एक और BaseModel से विरासत, नई कीवर्ड इस्तेमाल किया देखें तो प्रत्येक उदाहरण में से एक मान्य । जो मैं देख सकता हूं, वे दोनों मूल विशेषताओं का उपयोग करते हैं।

मैंने सत्यापन दिनचर्या पर स्पष्टता के लिए नियंत्रण कक्ष ControlModel जोड़ा है।

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 परीक्षण: अगर है = झूठी

ConsoleApplication1.BaseModel परीक्षण: अगर है = झूठी

ConsoleApplication1.ControlModel परीक्षण: अगर है = सच

से यह उदाहरण, ऐसा प्रतीत होता है कि आप विरासत में आवश्यक वैधता को ओवरराइड/छुपा/अनदेखा नहीं कर सकते हैं n (अभी तक दूसरों की कोशिश नहीं की है) विशेषताएं।

+0

मुझे जवाब देने और अपने स्वयं के प्रश्नों को स्वीकार करने से नफरत है, लेकिन ऊपर दिए गए परीक्षण से, ऐसा लगता है कि मूल प्रश्न पूछा गया है, हो सकता है किया गया। –

+0

क्या यह वास्तव में इसके लिए कोई समाधान नहीं है? – Giorgio

0

इस मामले में जहां आप वास्तव में एक नया संपत्ति

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

क्या यह गुणों को प्रतिस्थापित करता है? मैंने नए (आभासी संपत्ति के साथ) का उपयोग करने की कोशिश की है, लेकिन यह अभी भी सत्यापन को मार रहा है। –

+0

मैंने इस रणनीति का उपयोग अतीत में कुछ बार किया है। यह एक नई नई संपत्ति होनी चाहिए, इसलिए केवल एक सत्यापन विशेषता है या दूसरे को आग लगनी चाहिए। निस्संदेह यह निर्भर करता है कि आप वास्तव में किस संपत्ति का उपयोग करते हैं यह निर्धारित करने के लिए कि आप अपने मॉडल चर का घोषणा कैसे करते हैं या उपयोग करते हैं। यदि यह काम नहीं कर रहा है, तो आप यह देखने के लिए कुछ नियंत्रक कोड पोस्ट करना चाहेंगे कि हम क्यों समझ सकते हैं। – dumdum

+0

आपके उत्तर के लिए धन्यवाद, मेरे पास इस शाम का एक और प्रयास होगा और संभवतः बॉक्स को सीधे साइट पर भी आजमा सकते हैं। –