2011-03-04 17 views
47

मैं एमवीसी के भीतर शब्दकोश मूल्यों को बांधने की कोशिश कर रहा हूं।एएसपी.नेट एमवीसी एक शब्दकोश के लिए बाध्यकारी

कार्रवाई के भीतर मेरे पास है:

model.Params = new Dictionary<string, string>(); 

model.Params.Add("Value1", "1"); 
model.Params.Add("Value2", "2"); 
model.Params.Add("Value3", "3"); 

और दृश्य के भीतर मेरे पास है:

@foreach (KeyValuePair<string, string> kvp in Model.Params) 
{ 
<tr> 
    <td> 
    <input type="hidden" name="Params.Key" value="@kvp.Key" /> 
    @Html.TextBox("Params[" + kvp.Key + "]") 
    </td> 
</tr> 
} 

लेकिन दृश्य प्रारंभिक मान प्रदर्शित नहीं करता है, और जब प्रपत्र Params प्रस्तुत किया जाता है संपत्ति शून्य है?

उत्तर

49

आप स्कॉट Hanselman से इस पोस्ट के लिए एक नज़र डालनी चाहिए:

params[0].key = kvp.key 
params[0].value = kvp.value 

परम के सूचकांक, अनुक्रमिक होना चाहिए से शुरू: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

डिफ़ॉल्ट बांधने की मशीन सिर्फ प्रारूप में शब्दकोशों को समझने 0 और बिना किसी अंतराल के। वर्तमान सहायक इस का समर्थन नहीं करते हैं, इसलिए आपको स्वयं द्वारा फॉर्म इनपुट फ़ील्ड बनाना चाहिए।

आप निश्चित रूप से अपने खुद के बांधने की मशीन लागू कर सकते हैं, इस तरह: http://siphon9.net/loune/2009/12/a-intuitive-dictionary-model-binder-for-asp-net-mvc/

73

ASP.NET MVC 4 में, डिफ़ॉल्ट मॉडल बांधने की मशीन ठेठ शब्दकोश इंडेक्सर वाक्य रचना property[key] का उपयोग कर शब्दकोशों बाध्य होगा।

आप एक Dictionary<string, string> अपने मॉडल में है, तो आप अब इसे वापस करने के लिए निम्न मार्कअप के साथ सीधे बाध्य कर सकते हैं:

<input type="hidden" name="MyDictionary[MyKey]" value="MyValue" /> 

उदाहरण के लिए, यदि आप एक चुनने के लिए चेकबॉक्स का एक सेट उपयोग करना चाहते हैं एक शब्दकोश के तत्वों के सबसेट और वापस एक ही संपत्ति के लिए बाध्य है, तो आप निम्न कर सकते हैं: @ AntP के जवाब पर

@foreach(var kvp in Model.MyDictionary) 
{ 
    <input type="checkbox" name="@("MyDictionary[" + kvp.Key + "]")" 
     value="@kvp.Value" /> 
} 
+0

धन्यवाद इस बात के लिए बाध्य करने का काफी एक अच्छा तरीका। – valentin

+1

और आप के लिए एक अच्छा दिन महोदय! – kingdango

+5

क्या कोई अधिक विस्तृत उत्तर के लिए कोई लिंक प्रदान कर सकता है? शब्दकोश के लिए कोशिश की और यह काम नहीं किया, इसलिए मुझे पुराने इंडेक्सर सिंटैक्स के साथ जाना पड़ा। –

13

भवन, वहाँ एक और भी कम वर्बोज़ तरीका है, कम से कम MVC काम का अधिक (कर देके साथएक Dictionary<string, string> पर - मैं एक Dictionary<xxx, bool> पर CheckBoxFor() की कोशिश की है नहीं):

@foreach(var kvp in Model.MyDictionary) 
{ 
    @Html.Label(kvp.Key); 
    @Html.TextBoxFor(m => m.MyDictionary[kvp.Key]); 
} 
+1

'चेकबॉक्स' '' डिक्ट <स्ट्रिंग, बूल> 'के साथ काम करेगा, लेकिन यह किसी भी परिदृश्य में काम नहीं करेगा जहां आप विशिष्ट कुंजी/मूल्य जोड़े को बांधना चाहते हैं जहां मान केवल एक बूल नहीं है - ऐसा करने के लिए खुद को मार्कअप बनाने की आवश्यकता है (जैसा कि मेरे उदाहरण में)। –

+0

यह केवल बूलियन के लिए क्यों काम करना चाहिए? मुझे यह डिक्ट <स्ट्रिंग, स्ट्रिंग> के लिए काम करने के लिए मिला है, और मुझे नहीं लगता कि यह अन्य डेटा प्रकारों के लिए भी क्यों काम नहीं करना चाहिए। –

+0

@KaiWeber - यह शायद किसी भी 'शब्दकोश ' (वास्तव में, '' है जो मैं अपने उत्तर में उपयोग करता हूं) के लिए काम करता है। हालांकि, मैंने इसे किसी और चीज़ के साथ परीक्षण नहीं किया है।मुझे लगता है कि एंट पी कहता है कि यह केवल टाइप किए गए शब्दकोशों ('शब्दकोश <> ') के लिए काम करता है, और गैर-जेनेरिक संग्रह जैसे [IDictionary] (https://msdn.microsoft.com/en-us/library/system .collections.idictionary.aspx) – Sphinxxx

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