2013-02-12 16 views
8

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

public class Model 
{ 
    [UIHint("Currency")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:C}")] 
    [CustomRegularExpression(Currency.ValidationPattern, OnlyOnClientSide = true)] 
    [SetMetaDataForCustomModelBinder("Currency")] 
    public double? Cost { get; set; } 

    [UIHint("Currency")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:C}")] 
    [CustomRegularExpression(Currency.ValidationPattern, OnlyOnClientSide = true)] 
    [SetMetaDataForCustomModelBinder("Currency")] 
    public double? Profit { get; set; } 
} 

वहाँ एक [Currency] विशेषता यह है कि इन सभी विशेषताओं की कार्यक्षमता को जोड़ती है एक साधारण गुण होने के लिए बनाने के लिए कोई तरीका है? मेरा लक्ष्य निम्नलिखित बनाने के लिए होगा:

public class Model 
{ 
    [Currency] public double? Cost { get; set; } 
    [Currency] public double? Profit { get; set; } 
} 

संपादित करें: स्पष्ट करने के लिए, मैं एक कस्टम विशेषता बनाने की कोशिश की है, लेकिन वहाँ उजागर नहीं इंटरफेस है कि मुझे उन अलग-अलग विशेषताओं की कार्यक्षमता को लागू करने की अनुमति होगी रहे हैं। मैं प्रमाणीकरण एट्रिब्यूट subclass कर सकते हैं, लेकिन फिर मैं UIHintAttribute subclass भी नहीं कर सकता। कोई अन्य संभावित समाधान मैं याद कर रहा हूँ?

+0

दिलचस्प सवाल आप कुछ इस तरह होगा। यह @DarinDimitrov क्षेत्र –

+0

मेरा अनुमान है कि आपको पोस्टशर्प जैसे कुछ की आवश्यकता होगी और एओपी का उपयोग करें। –

+0

मैं उत्सुक हूं कि यह कैसे किया जाएगा। मुझे यह – amhed

उत्तर

3

post के अनुसार और पोस्ट के संदर्भ में फिल हैक के article पर आप अपना कस्टम AssociatedMetadataProvider बना सकते हैं जो आपको आवश्यक गुण जोड़ता है।

public class MyCustomMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
    { 
     var attributeList = attributes.ToList(); 
     if (attributeList.OfType<CurrencyAttribute>().Any()) 
     { 
      attributeList.Add(new UIHintAttribute("Currency")); 
      attributeList.Add(new DisplayFormatAttribute 
      { 
       ApplyFormatInEditMode = true, 
       DataFormatString = "{0:C}" 
      }); 
     } 

     return base.CreateMetadata(attributeList, containerType, modelAccessor, modelType, propertyName); 
    } 
} 

और आवेदन शुरू स्थिति में:

ModelMetadataProviders.Current = new MyCustomMetadataProvider(); 
+0

ग्रेट समाधान! बहुत बहुत धन्यवाद! –

+0

@MattMurrell क्या यह समाधान आपके लिए काम करता है क्योंकि यह मेरे लिए काम नहीं कर रहा है - UIHintAttribute काम नहीं कर रहा है? – CodingYoshi

संबंधित मुद्दे