2016-11-21 9 views
6

मैंने मल्टीसेलेलिस्ट का उपयोग करने के बारे में कई लेख पढ़े हैं और अभी तक यह समझना नहीं है कि मेरे DropDownListFor के साथ क्या गलत हो रहा है। मेरे पास एक सूची, ViewModel और डेटा के साथ एक सूची बॉक्स है जो ठीक काम करता है। मैं DropDownListFor का उपयोग अपने विकल्प लेबल पैरामीटर के कारण करना चाहता हूं जो ListBoxFor के पास नहीं है।सबमिट करने के बाद DropDownListFor एकाधिक चयन क्यों खो देता है लेकिन ListBoxFor नहीं करता है?

जब दृश्य पहली बार लोड होता है, तो DropDownListFor और ListBoxFor दोनों चयनित आइटम दिखाते हैं।

Initial View

जब सबमिट बटन क्लिक किया जाता है, चयनित आइटम संग्रह वापस नियंत्रक कार्रवाई के लिए ठीक पोस्ट किया जाता है और देखने ListBoxFor अभी भी दोनों चयनित आइटम दिखा लेकिन DropDownListFor केवल एक चयनित आइटम दिखाया जा रहा है के साथ ताजा है ।

Refreshed View नियंत्रक कार्रवाई इस तरह MultiSelectList निर्माण कर रही है:

vm.TasksFilterGroup.Assignees = new MultiSelectList(employees, "Id", "FullName", new string[] { "51b6f06a-e04d-4f98-88ef-cd0cfa8a2757", "51b6f06a-e04d-4f98-88ef-cd0cfa8a2769" }); 

देखें कोड इस तरह दिखता है:

<div class="form-group"> 
 
    <label>ListBoxFor</label> 
 
    @Html.ListBoxFor(m => m.TasksFilterGroup.SelectedAssignees, Model.TasksFilterGroup.Assignees, new { @class = "form-control", multiple = "multiple" }) 
 
</div> 
 
<div class="form-group"> 
 
    <label>DropDownListFor</label> 
 
    @Html.DropDownListFor(m => m.TasksFilterGroup.SelectedAssignees, Model.TasksFilterGroup.Assignees, new { @class = "form-control", multiple = "multiple" }) 
 
</div>

क्यों DropDownListFor कई चुनाव खो करता है के बाद जमा करें लेकिन ListBoxFor नहीं करता है? एक <select multiple> (कई विकल्पों का चयन करने के लिए)

उत्तर

15

तरीकों के नाम संकेत के रूप में, DropDownListFor() एक <select> (चयन करने के लिए 1 विकल्प) बनाने के लिए है और ListBoxFor() बनाने के लिए है। जबकि दोनों विधियां बहुत आम कोड साझा करती हैं, वे अलग-अलग परिणाम उत्पन्न करते हैं।

multiple="multiple" विशेषता जोड़ने से प्रदर्शन में परिवर्तन होता है, लेकिन यह इन तरीकों से निष्पादित कोड की कार्यक्षमता को नहीं बदलता है।

आप source code का निरीक्षण किया, तो आप देखेंगे कि सभी DropDownListFor() के भार के अंत में private static MvcHtmlString DropDownListHelper() विधि कॉल, और इसी ListBoxFor() अंततः private static MvcHtmlString ListBoxHelper() प्रणाली को बुलाती है।

इन दोनों तरीकों private static MvcHtmlString SelectInternal() विधि कॉल, लेकिन अंतर यह है कि DropDownListHelper() गुजरता allowMultiple = false जबकि ListBoxHelper() गुजरता allowMultiple = true है।

SelectInternal() विधि के भीतर, कोड के प्रमुख लाइन

object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string)); 

है defaultValue का मूल्य तो जब <option> तत्वों के लिए एचटीएमएल निर्माण और selected विशेषता (विशेषताओं) स्थापित करने के लिए प्रयोग किया जाता है प्रयोग किया जाता है।

ListBoxFor() के मामले में, defaultValue का मान आपके SelectedAssignees संपत्ति द्वारा परिभाषित सरणी होगी। DropDownListFor() के मामले में यह null देता है क्योंकि आपकी संपत्ति का मूल्य string (इसकी एक सरणी) पर नहीं डाला जा सकता है।

क्योंकि defaultValuenull है, <option> तत्वों में से कोई भी selected विशेषता निर्धारित है और आप मॉडल बंधन खो देते हैं।

एक तरफ ध्यान दें, यदि आप GET पद्धति में SelectedAssignees के मूल्यों को निर्धारित करने से पहले आप को देखने के लिए मॉडल पारित थे, तो आप उनमें से है कि किसी का चयन नहीं कर रहे हैं जब ऊपर वर्णित एक ही कारण के लिए DropDownListFor() का उपयोग कर देखेंगे।

भी ध्यान रखें कि पैदा करने के लिए कोड SelectList सिर्फ होना चाहिए

vm.TasksFilterGroup.Assignees = new SelectList(employees, "Id", "FullName" }); 

कोई 3 पैरामीटर है जब या तो DropDownListFor() या ListBoxFor() तरीकों का उपयोग कर, क्योंकि संपत्ति के अपने मूल्य आपके लिए बाध्य बिंदु है (SelectedAssignees) जो निर्धारित करता है कि कौन से विकल्प चुने गए हैं (3 पैरामीटर विधियों द्वारा अनदेखा किया जाता है)। यदि आप चाहते हैं उन Guid मूल्यों मिलान विकल्प का चयन किया जाना है, तो GET पद्धति में,

vm.TasksFilterGroup.SelectedAssignees= new string[]{ "51b6f06a-e04d-4f98-88ef-cd0cfa8a2757", "51b6f06a-e04d-4f98-88ef-cd0cfa8a2769" }; 
+1

यह पूरी तरह से और जानकार प्रतिक्रिया बहुत सराहना कर रहा है का उपयोग करें। धन्यवाद। – RJBreneman

+0

यह एक महान और गहराई से जवाब है। बहुत अंतर्दृष्टि – CodingYoshi

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