2010-07-28 14 views
5

मेरे पास यह एक एएसपी.नेट एमवीसी व्यू में ड्रॉप डाउन सूची को पॉप्युलेट करने के लिए है।एएसपी.नेट एमवीसी: DropDownListFor किसी भी विकल्प का चयन नहीं करता

<%= Html.DropDownListFor(model => model.Bikes, 
     Model.Bikes.Select(
     x => new SelectListItem { 
       Text = x.Name, 
       Value = Url.Action("Details", "Bike", new { bikeId = x.ID }), 
       Selected = x.ID == Model.ID, 
      })) %> 

इस मैं कर सकते हैं डिबगिंग देखते हैं कि Selected संपत्ति true पर सेट किया जाता है जब यह होना चाहिए। लेकिन जब दृश्य प्रस्तुत किया जाता है, तो सूची में से कोई भी विकल्प चयनित नहीं होता है। मुझे एहसास है कि यह DropDownListFor के दूसरे अधिभार के साथ किया जा सकता है लेकिन मैं वास्तव में यह संस्करण काम करना चाहता हूं।

कोई विचार?

उत्तर

5

आपका चयनित मान काम नहीं करता है क्योंकि आप विकल्प मूल्यों के रूप में यूआरएल का उपयोग कर रहे हैं लेकिन खंड में Model.ID निर्दिष्ट करते हैं।

इस तरह का प्रयास करें:

<%= Html.DropDownListFor(
    model => model.Bikes, 
    new SelectList(Model.Bikes, "Id", "Name", Model.ID) 
)%> 

"Id" संपत्ति है कि विकल्प मान के रूप में इस्तेमाल किया जाएगा इंगित करता है, जबकि "Name" संपत्ति है कि विकल्प लेबल के रूप में इस्तेमाल किया जाएगा इंगित करता है।

आप संरक्षित करना चाहते हैं Url.Action आप की कोशिश कर सकते:

<%= Html.DropDownListFor(
    model => model.Bikes, 
    new SelectList(Model.Bikes.Select(x => new { 
     Id = x.Id, 
     Name = Url.Action("Details", "Bike", new { bikeId = x.ID }) 
    }), "Id", "Name", Model.ID) 
)%> 

आप देखेंगे कि मैं नाम और क्रमांक उल्टे गए हैं के रूप में इसे और अधिक विकल्प मान के रूप में मॉडल आईडी का उपयोग करने के तार्किक लग रहा था।


अद्यतन:

कारण यह काम नहीं करता है, क्योंकि आप एक IEnumerable (DropDownListFor सहायक के पहले तर्क) के लिए बाध्य कर रहे हैं। यह एक अदिश संपत्ति है, जबकि आप एक ही model.Bikes संग्रह का उपयोग कर रहे होना चाहिए:

<%= Html.DropDownListFor(
    model => model.SelectedBikeValue, 
    Model.Bikes.Select(
     x => new SelectListItem { 
       Text = x.Name, 
       Value = Url.Action("Details", "Bike", new { bikeId = x.ID }), 
       Selected = x.ID == Model.ID, 
     } 
)) %> 

URL का उपयोग नहीं के रूप में विकल्प मान सच खड़ा है के बारे में मेरे टिप्पणी।

+0

ध्यान दें कि मेरे मूल प्रश्न में मान URL हैं। –

+1

हां, मैंने यह देखा है, लेकिन जैसा कि यह मुझे एक बुरा विचार लग रहा था मैंने उन्हें उलटा कर दिया है। वैसे ही यही कारण है कि आपका चयनित मूल्य काम नहीं करता है। आप मॉडल को पास कर रहे हैं। चयनित मूल्यों के रूप में आईडी और विकल्प मान के रूप में यूआरएल का उपयोग कर रहे हैं। अच्छा नहीं।मैं अनुशंसा करता हूं कि आप आईडी को विकल्प मान के रूप में संरक्षित करें और यदि आवश्यक हो तो उस नियंत्रक कार्रवाई में संबंधित यूआरएल प्राप्त करें जिसे आप सबमिट कर रहे हैं। मुझे विकल्प मान के रूप में यूआरएल का उपयोग करने के लिए उचित नहीं दिख रहा है। –

+0

मेरे मूल कोड में मैं विकल्प मान के रूप में चयनित मानों और यूआरएल के रूप में आईडी पास नहीं कर रहा हूं। मैं जो कर रहा हूं वह मानों को यूआरएल में सेट कर रहा है और फिर उस स्थिति का उपयोग कर रहा है जिसे आइटम को चुनने के लिए रखना चाहिए। और क्या वास्तव में कोई अनिवार्य कारण है कि मुझे मूल्यों के लिए यूआरएल का उपयोग क्यों नहीं करना चाहिए? –

0

मुझे इस अवधारणा के साथ इतनी सारी परेशानी हुई है। यह विशेष रूप से प्रकट होता है जब आप इसे "नाम" किसी ऑब्जेक्ट में उस गुण वाले मॉडल से संपत्ति नहीं दे सकते हैं, क्योंकि इस ऑब्जेक्ट का नाम स्वचालित रूप से नाम पर प्रीपेड किया जाता है। यह पागलपन है। इसे समझने की कोशिश करने के कई घंटों बर्बाद करने के बाद मैंने बस अपना खुद का ड्रॉप-डाउन एक्सटेंशन छोड़ दिया और मैंने यहां प्रकाशित किया। यह बहुत आसान है और यह ठीक काम करता है।

public static MvcHtmlString SimpleDropDown(this HtmlHelper helper, object attributes, IEnumerable<SelectListItem> items, bool disabled = false) 
    { 
     XElement e = new XElement("select", 
      items.Select(a => { 
       XElement option = new XElement("option", a.Text); 
       option.SetAttributeValue("value", a.Value); 
       if (a.Selected) 
        option.SetAttributeValue("selected", "selected"); 
       return option; 
      }) 
      ); 

     if (attributes != null) 
     { 
      Dictionary<string, string> values = (from x in attributes.GetType().GetProperties() select x).ToDictionary(x => x.Name, x => (x.GetGetMethod().Invoke(attributes, null) == null ? "" : x.GetGetMethod().Invoke(attributes, null).ToString())); 
      foreach(var v in values) 
       e.SetAttributeValue(v.Key, v.Value); 
     } 

     if (disabled) 
      e.SetAttributeValue("disabled", ""); 

     return new MvcHtmlString(e.ToString()); 
    } 

इसके अलावा, मैं एक अतिरिक्त पैरामीटर के रूप में ध्वज विकलांग शब्दों में कहें, अगर आप विशेषताओं का मानक गुमनाम सूची के माध्यम से इसे करने के लिए बाध्य करना चाहते हैं, यह काफी एक परेशानी हो सकती है क्योंकि।

नीचे एक उदाहरण है कि मैं इस समय इसका उपयोग कैसे करता हूं। मैं एक शब्दकोश को SelectListItem की सूची में अनुवाद करता हूं, लेकिन यह सिर्फ एक साधारण सूची हो सकती है।

@Html.SimpleDropDown(new { id="EOM", name = "EOM", @class = "topBox" }, Model.EOM.Select(x => new SelectListItem { Text = x.Value, Value = x.Key.ToString(), Selected = Model.EOM.Selected == x.Key }), !Model.EOM.Available) 
संबंधित मुद्दे