2012-06-14 20 views
16

से मूल्य का चयन नहीं करने के लिए मैं एएसपी.नेट एमवीसी 3 का उपयोग कर रहा हूं, और DropDownListFor एचटीएमएल हेल्पर का उपयोग करके बस 'गॉचाचा' में भाग गया।एएसपी.नेट एमवीसी ड्रॉपडाउनलिस्ट मॉडल

मैं अपने नियंत्रक में ऐसा करते हैं:

ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes(); 

और GetShippingTypes विधि:

public SelectList GetShippingTypes() 
{ 
    List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes(); 

    return new SelectList(shippingTypes, "Id", "Name"); 
} 

कारण मैं ViewBag में और मॉडल में नहीं डाल दिया (मैं दृढ़ता से टाइप किया है के लिए मॉडल प्रत्येक दृश्य), यह है कि मेरे पास एक आइटम टेम्पलेट का उपयोग करने वाले आइटमों का संग्रह है, जिन्हें शिपिंग प्रकार टाइप सूची तक पहुंचने की भी आवश्यकता है।

अन्यथा मुझे पूरे संग्रह के माध्यम से लूप करने की आवश्यकता है, और फिर शिपिंग टाइप संपत्ति को असाइन करना होगा।

अभी तक इतना अच्छा है।

मेरी नजर में, मैं यह कर:

@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList) 

,

क्या होता है (RequiredShippingTypeId प्रकार Int32 की है) कि RequiredShippingTypeId का मूल्य नहीं ड्रॉप डाउन में चयनित है।

मैं इस भर में आया था: http://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx

उनका सुझाव है कि MVC ViewData, जब चयन सूची ViewData से है से चयनित मूल्य देखने होंगे। मुझे यकीन नहीं है कि यह अब मामला है, क्योंकि ब्लॉग पोस्ट पुराना है और वह एमवीसी 1 बीटा के बारे में बात कर रहा है।

का संभावित हल है कि इस मुद्दे को हल करती है यह है: कोई आइटम नहीं चुना:

@Html.DropDownListFor(m => m.RequiredShippingTypeId, new SelectList(ViewBag.ShippingTypes as IEnumerable<SelectListItem>, "Value", "Text", Model.RequiredShippingTypeId.ToString())) 

मैं अंत है, जो मुझे पहले की तरह ही व्यवहार देता है पर RequiredShippingTypeId पर ToString के लिए नहीं की कोशिश की।

मुझे लगता है कि यह एक डाटाटाइप मुद्दा है। आखिरकार, एचटीएमएल हेल्पर Int32 (RequiredShippingTypeId से) के साथ तारों (चयन सूची में) की तुलना कर रहा है।

लेकिन क्यों यह जब ViewBag में selectList डाल काम नहीं करता है - जब यह पूरी तरह से काम करता है जब यह एक मॉडल को जोड़ने, और देखने के अंदर यह कर:

@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes) 
+0

वैकल्पिक हल के लिए धन्यवाद! तो यह स्पष्ट नहीं है कि जादू केवल "सरल" लैम्ब्डा अभिव्यक्तियों के साथ काम करता है, और सिस्टम इसके बारे में कोई चेतावनी नहीं देता है। –

उत्तर

30

कारण है कि यह काम नहीं करता DropDownListFor सहायक की एक सीमा की वजह से है: यह लैम्ब्डा अभिव्यक्ति पहला तर्क के रूप में पारित का उपयोग कर केवल अगर यह लैम्ब्डा अभिव्यक्ति एक है चयनित मान लगा सकते है सरल संपत्ति पहुंच अभिव्यक्ति। उदाहरण के लिए यह एरे इंडेक्सर एक्सेस एक्सप्रेशन के साथ काम नहीं करता है जो संपादक टेम्पलेट की वजह से आपका मामला है।

आप मूल रूप से (संपादक टेम्पलेट को छोड़कर) है:

@Html.DropDownListFor(
    m => m.ShippingTypes[i].RequiredShippingTypeId, 
    ViewBag.ShippingTypes as IEnumerable<SelectListItem> 
) 

निम्नलिखित समर्थित नहीं है: m => m.ShippingTypes[i].RequiredShippingTypeId। यह केवल साधारण संपत्ति पहुंच अभिव्यक्तियों के साथ काम करता है लेकिन अनुक्रमित संग्रह पहुंच के साथ नहीं।

वैकल्पिक हल आप पाया है इस समस्या को हल करने के लिए, जब SelectList निर्माण स्पष्ट रूप से चयनित मान पारित करके सही तरीका है।

+0

अरे, मुझे यह नहीं पता था। मैं पुष्टि कर सकता हूं कि यह वास्तव में मामला है। मैंने 'शिपिंगबैप्स' से 'शिपिंगबैप्स' का उपयोग करने की कोशिश की, ड्रॉप डाउन के मॉडल के बजाय, जो सामान्य शिपिंग प्रकार लेता है: '@ एचटीएमएल.ड्रॉपडाउन लिस्टफोर (एम => एम। प्रोडक्ट। रिक्वेर्डशिपिंग टाइप टाइप, व्यूबैग। साइडिंग टाइप टाइपलिस्ट के रूप में) '- और वह काम करता है। तो, मुझे लगता है कि मुझे बदसूरत कामकाज से चिपकना है, मेरे विचारों में गंदे हैक छोड़ने के बजाय, इसके लिए एक HTML सहायक लिख सकता है। – MartinHN

+0

@ डारिन - क्या आप मुझे इसके लिए प्रलेखन में इंगित कर सकते हैं? धन्यवाद। – mokumaxCraig

+0

ऐसा लगता है कि यदि आप कुछ अन्य ऑब्जेक्ट/उपनाम का उपयोग कर रहे हैं तो मूल्य प्राप्त करने के लिए '@ एचटीएमएल। डॉपडाउन लिस्टफ़ोर (एम => myViewModel.RequiredShippingTypeID, ... 'धन्यवाद! – xr280xr

0

यह मूर्खतापूर्ण हो सकता है, लेकिन क्या इसे आपके दृश्य में एक चर में जोड़ना कुछ भी करता है?

var shippingTypes = ViewBag.ShippingTypes; 

@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, shippingTypes) 
+0

नहीं, यह समस्या का समाधान नहीं करेगा। –

+0

मैंने कभी कोशिश नहीं की, लेकिन मुझे यकीन है कि @DarinDimitrov सही है। – MartinHN

+0

k ठंडा बस सोचा कि मैं इसे एक संभावित "क्लीनर" कामकाज के रूप में सुझाव दूंगा। – Terry

0

इस संभाल करने के लिए @ html.DropdownList के लिए एक अतिभारित विधि नहीं है। HTML ड्रॉपडाउन सूची पर चयनित मान सेट करने का एक विकल्प है।

@Html.DropDownListFor(m => m.Section[b].State, 
       new SelectList(Model.StatesDropdown, "value", "text", Model.Section[b].State)) 

मैं मॉडल से चयनित मूल्य प्राप्त करने में सक्षम था।

"value", "text", Model.Section[b].State इस खंड ऊपर वाक्य रचना मूल्य आप जटिल प्रकार के लिए प्रत्येक dropdownlist क्षेत्र के लिए गतिशील बजाय ViewData viewbag बना सकते हैं नियंत्रक

0

से लोड करने के लिए चयनित विशेषता कहते हैं। आशा है कि यह दे देंगे आप कैसे

 @if (Model.Exchange != null) 
 
           { 
 
            for (int i = 0; i < Model.Exchange.Count; i++) 
 
            { 
 
             <tr> 
 
              @Html.HiddenFor(model => model.Exchange[i].companyExchangeDtlsId) 
 
              <td> 
 
                
 
               @Html.DropDownListFor(model => model.Exchange[i].categoryDetailsId, ViewData["Exchange" + i] as SelectList, " Select category", new { @id = "ddlexchange", @class = "form-control custom-form-control required" }) 
 
               @Html.ValidationMessageFor(model => model.Exchange[i].categoryDetailsId, "", new { @class = "text-danger" }) 
 
              </td> 
 
              <td> 
 
               @Html.TextAreaFor(model => model.Exchange[i].Address, new { @class = "form-control custom-form-control", @style = "margin:5px;display:inline" }) 
 
              
 
               @Html.ValidationMessageFor(model => model.Exchange[i].Address, "", new { @class = "text-danger" }) 
 
              </td> 
 
             </tr> 
 
            } 
 

 
           }

ViewModel CompanyDetail = companyDetailService.GetCompanyDetails(id); 
 
       if (CompanyDetail.Exchange != null) 
 
       for (int i = 0; i < CompanyDetail.Exchange.Count; i++) 
 
       { 
 
        ViewData["Exchange" + i]= new SelectList(companyDetailService.GetComapnyExchange(), "categoryDetailsId", "LOV", CompanyDetail.Exchange[i].categoryDetailsId); 
 
       }

0

कि मैं सिर्फ इस सीमा से टक्कर मार दी थी और एक सरल समाधान का पता लगा करने के लिए संकेत। बस चयनित विस्तार विधि जो आंतरिक रूप से चयनित चयनित आइटम के साथ SelectList उत्पन्न करती है।

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString DropDownListForEx<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression, 
     IEnumerable<SelectListItem> selectList, 
     object htmlAttributes = null) 
    { 
     var selectedValue = expression.Compile().Invoke(htmlHelper.ViewData.Model); 
     var selectListCopy = new SelectList(selectList.ToList(), nameof(SelectListItem.Value), nameof(SelectListItem.Text), selectedValue); 

     return htmlHelper.DropDownListFor(expression, selectListCopy, htmlAttributes); 
    } 
} 

सबसे अच्छी बात यह है कि इस विस्तार के मूल DropDownListFor के रूप में एक ही तरह से इस्तेमाल किया जा सकता है:

@for(var i = 0; i < Model.Items.Count(); i++) 
{ 
    @Html.DropDownListForEx(x => x.Items[i].CountryId, Model.AllCountries) 
} 
संबंधित मुद्दे