2012-02-07 9 views
10

मैं कस्टम मॉडलबिंडर्स का उपयोग कर नया हूं, मैं चारों ओर देख रहा हूं और मुझे इस विशिष्ट मामले से संबंधित कोई पोस्ट नहीं मिल सका।एमवीसी 3.0 मॉडलबिन्डर बाइंडिंग कॉन्टेक्स्ट। वैल्यूप्रोवाइडर। गेटवैल्यू (कुंजी) संग्रह में बाध्यकारी होने पर शून्य लौटाता है

मैं एक इकाई की तरह:

public class DynamicData 
    { 
     public IList<DynamicDataItem> DynamicDataItems{get;set;} 
    } 

देखें में मैं बाँध इसे पसंद इस प्रकार है:

@Html.EditorFor(model => model.DynamicDataItems); 

मैं कक्षा DynamicDataItems में विशेष जानकारी नहीं है, कि मैं एक में प्राप्त करना चाहते हैं विशिष्ट तरीका, इसलिए मैंने अपना खुद का मॉडल बाइंडर बनाया।

public class DynamicDataItemBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, 
      ModelBindingContext bindingContext) 
     { 
      var key = bindingContext.ModelName; 
      var valueProviderResult = bindingContext.ValueProvider 
       .GetValue(key); 

      if (valueProviderResult == null || 
       string.IsNullOrEmpty(valueProviderResult 
        .AttemptedValue)) 
      { 
       return null; 
      } 

      //Here retrieve my own Information 

      return DynamicDataItem; 
     } 
    } 

bindingContext.ModelName शामिल है "DynamicDataItem [0]"।

यदि मैं बाध्यकारी कॉन्टेक्स्ट करता हूं। वैल्यूप्रोवाइडर। कॉन्टेन्सफ्रिक्स (कुंजी), यह सच हो जाता है, लेकिन जब मैं GetValue (कुंजी) करता हूं, तो यह शून्य हो जाता है। यदि मैं मानता हूं कि ValueProvider में क्या है, तो मुझे लगता है कि "डायनामिकडेटाइटम [0]" में उनकी कुंजी शुरू होने वाली कई चीज़ें हैं। वर्तमान में बाध्य किए जा रहे आइटम के लिए सभी फ़ील्ड से जानकारी पुनर्प्राप्त करने के लिए मुझे कैसे समझा जाता है ("डायनामिकडेटाइटम [0]")? क्या मुझे उन्हें एक-एक करके पुनर्प्राप्त करना चाहिए? इस तरह:

var result1= bindingContext.ValueProvider.GetValue("DynamicDataItem[0].Id"); 
var result2= bindingContext.ValueProvider.GetValue("DynamicDataItem[0].Name"); 

मैं बहुत किसी भी मार्गदर्शन तुम मुझे इस के साथ दे सकते हैं की सराहना करेंगे।

+0

मैं आपको सुझाव देता हूं कि [इस लिंक] [1] पर जाएं। मुझे लगता है कि यह आपकी समस्या के लिए उपयोगी है। [1]: http://stackoverflow.com/a/25902872/1817640 – Jahan

उत्तर

1

समस्या यह प्रतीत होती है कि आप किसी इनपुट में DynamicDataItem के प्रकार को बाध्य करने का प्रयास कर रहे हैं। चूंकि DynamicDataItem एक स्ट्रिंग या कुछ अन्य आदिम प्रकार नहीं है, इसलिए बाध्यकारी के लिए यह पता लगाने का कोई आसान तरीका नहीं है कि आपके इनपुट के साथ क्या करना है और यह शून्य हो जाता है।

कक्षा DynamicDataItem मानते हुए कि आप अपनी इच्छाओं के गुण हैं DynamicDataItem की प्रत्येक संपत्ति के लिए संपादक प्रदान करते हैं। यदि आप जो कुछ करने की कोशिश कर रहे हैं, वह एक मॉडल को बच्चे के ऑब्जेक्ट्स के एक बाध्य संग्रह के साथ पास करता है, तो आपको कस्टम मॉडल बाइंडर की भी आवश्यकता नहीं होती है। क्या मुझे लगता है कि आप चाहते हैं कि आपके ध्यान में रखते हुए कुछ पढ़ता है कि जैसे विषय पर इस

<input type="text" name="DynamicDataItem[0].SomeTextField" /> 
<input type="text" name="DynamicDataItem[0].SomeOtherTextField" /> 

चेक बाहर फिल Haack और स्कॉट Hanselman अधिक

Here और Here

मुझे आशा है कि मदद करता है

है
1

मेरे पास same issue था जब आप खोद रहे थे और मुझे आपका पृष्ठ मिला और मुझे लगता है कि यह आपकी भी मदद कर सकता है :):

this link की समीक्षा करने के बाद मुझे विचार है: मूल रूप से क्वेरीस्ट्रिंग को पार्स करने का प्रयास कर रहा है। आप इसे controlercontext.httpcontext में पा सकते हैं।

उम्मीद है कि इस मदद करता है

सादर

0

मैं जानता हूँ कि इस पुरानी पोस्ट है, लेकिन मैं एक ही समस्या है और मेरे समाधान bindingContext का इस्तेमाल किया गया है।मॉडलनाम:

ValueProviderResult result = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name); 
if(result == null) 
    result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "." + propertyDescriptor.Name); 
संबंधित मुद्दे