2011-03-09 14 views
15

में मॉडलमैटाडाटा प्रदाता से ऑब्जेक्ट उदाहरण प्राप्त करें जिसमें एएसपी.नेट एमवीसी 2 में कस्टम DataAnnotationsModelMetadataProvider लागू किया गया है।एएसपी.नेट एमवीसी

वस्तु है कि प्रदान की जा रही मान लिया जाये कि इस तरह दिखता है:

- Contact : IUpdateable 
    - Name: string 
    - ContactType: (Lead, Prospect, Customer) 

और नीचे दी गई विधि अर्थ Contact.ContactType के संदर्भ में है कि:

  • meta.PropertyName == "ContactType"
  • meta.ContainerType == typeof(Contact)
  • meta.Model == ContactType.Lead

(सवाल :) तहत कोड

protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, 
    Type containerType, 
    Func<object> modelAccessor, 
    Type modelType, string propertyName) { 

    var containerInstance = meta.NotSureWhatGoesHere as IUpdateable; 
    meta.IsReadOnly = containerInstance != null && containerInstance.CanBeUpdated(meta.PropertyName); 
} 

सवाल: मैं मेटाडाटा से संपर्क के कहने कैसे प्राप्त कर सकते हैं? (सही के साथ NotSureWhatGoesHere को प्रतिस्थापित करें)?

धन्यवाद।

उत्तर

11

गंदा रास्ता (mvc3 में परीक्षण किया गया):

object target = modelAccessor.Target; 
object container = target.GetType().GetField("container").GetValue(target); 

यह मॉडल => model.Contact.Name model.Contact के बजाय में मॉडल वापस आ जाएगी। शेष पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है;)। यह विधि आती है, क्योंकि सभी प्रतिबिंब आधारित समाधान वारंटी के बिना गैर सार्वजनिक डेटा में घूमते हैं।

+0

यह एक दिलचस्प चाल है! इसे बाद में एक शॉट दे देंगे। धन्यवाद। –

+1

ऐसा लगता है कि इससे अधिक जटिल है। एक अभिव्यक्ति वृक्ष (और इसके भाग संकलित) को पार करना आवश्यक है और मेटा में मौजूद जानकारी के आधार पर जादुई रूप से कंटेनर ढूंढना आवश्यक होगा। मेटा कंटेनर इंस्टेंस के बारे में कोई विवरण नहीं प्रदान करता है जो आवश्यक कंटेनर इंस्टेंस की पहचान कर सकता है (कंटेनरनाम और टाइप ऐसा करने के लिए पर्याप्त नहीं है क्योंकि उनमें से कई लोग हो सकते हैं)। –

+0

यह मेरे लिए काम किया। –

0

क्या यह modelAccessor पैरामीटर के लिए है?

प्रयास करें:

var containerInstance = modelAccessor() as IUpdateable; 
+0

नहीं, वह 'ContactType.Lead' के संदर्भ में है। 'modelAccessor()' इस मामले में 'मेटा.मोडेल' जैसी ही चीज़ लौटाता है; केवल अंतर यह है कि यदि आपका मॉडल 'मॉडल एक्सेसर' शून्य है, तो आपका कोड असफल हो जाएगा, लेकिन 'मेटा। मॉडल' शून्य वापस आता है। –

2

मुझे नहीं लगता कि आप कर सकते हैं। I asked Brad Wilson (author of ModelMetadata, et. al.) about this directly, and he couldn't come up with a way. मुझे अंततः एक अलग मार्ग जाना पड़ा।

+0

बहुत बहुत धन्यवाद। यह बहुत निराशाजनक लगता है। क्या आपको पता है कि इस संबंध में एमवीसी 2 से एमवीसी 3 में कुछ बदल गया है? –

+0

@ डेमेट्री, मैंने अभी तक इसे एमवीसी 3 में नहीं देखा है। –

+0

ऐसा लगता है कि यह एमवीसी 3 या एमवीसी 4 में बदल गया है। 'CreateMetadata' विधि अभी भी कंटेनर प्रकार को पास कर चुकी है, उदाहरण के लिए नहीं। –

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