DropDownListFor का चयन मूल्य नहीं है


83

मैं एक संपादित पृष्ठ के अंदर DropDownListFor हेल्पर विधि का उपयोग कर रहा हूं और मेरे द्वारा निर्दिष्ट मूल्य का चयन करने के लिए इसे प्राप्त करने में कोई भाग्य नहीं है। मैंने Stackoverflow पर एक समान प्रश्न देखा । सुझाया गया वर्कअराउंड था, "व्यू कोड में अपने सेलेक्टिस्ट को पॉप्युलेट करें"। समस्या यह है कि मैंने पहले ही यह कोशिश कर ली है और यह अभी भी काम नहीं कर रहा है।

<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>

मैंने एक ब्रेकपॉइंट सेट किया है और मॉडल के अस्तित्व (और वैधता) को सत्यापित किया है। AddressStateAbbr। मुझे यकीन नहीं है कि मैं क्या याद कर रहा हूँ।

जवाबों:


184

एक घंटे तक शोध करने के बाद, मैंने पाया कि समस्या के कारण सेट नहीं हो पा रहा है DropDownListFor। कारण यह है कि आप ViewBag का नाम मॉडल की संपत्ति के समान उपयोग कर रहे हैं।

उदाहरण

public  class employee_insignia
{ 
   public int id{get;set;}
   public string name{get;set;}
   public int insignia{get;set;}//This property will store insignia id
}

// If your ViewBag's name same as your property name 
  ViewBag.Insignia = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

राय

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")

चयनित विकल्प ड्रॉपडेलिस्ट पर सेट नहीं होगा, लेकिन जब आप ViewBag का नाम अलग-अलग नाम में बदलते हैं तो चयनित विकल्प सही दिखाई देगा।

उदाहरण

ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

राय

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")

34
यह वास्तव में एक सही उत्तर है !!! हर किसी के लिए, सुनिश्चित करें कि आप ViewBag संपत्ति को मॉडल संपत्ति के समान नहीं बनाते हैं! मुझे इस बात की बिल्कुल भी उम्मीद नहीं थी, लेकिन यह वास्तव में इसे तय करता है। मैं हैरान हूँ।
Tesserex

10
मेरे पास एक ही समस्या है, भले ही ViewBag संपत्ति का मॉडल संपत्ति के लिए एक अलग नाम है:@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
पॉल टेलर

8
क्या किसी को कारण पता है कि वे समान क्यों नहीं हो सकते हैं? इस उत्तर ने मेरे लैपटॉप को
तोड़े

7
मुझे समझ नहीं आ रहा है। मुझे यह समस्या आ रही है और हम ViewBag का उपयोग नहीं कर रहे हैं। यह भी सवाल ViewBag
जॉर्ज Mauer

3
मैं इसे ASP.NET MVC बग मानता हूं!
नेस्टॉर सैंचेज़ ए।

30

प्रयत्न:

<%= Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")%>

या रेजर सिंटैक्स में:

@Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")

अभिव्यक्ति आधारित सहायक आपके SelectList में SelectListItems की चयनित संपत्ति का सम्मान नहीं करते हैं।


धन्यवाद! मुझे अपने डेटाबेस रिपॉजिटरी से अपने चयनित मूल्य को प्राप्त करने के लिए एक त्वरित तरीके की आवश्यकता थी! Model.AddressStateAbbr वह हिस्सा था जिसकी मुझे ज़रूरत थी। मिठाई। धन्यवाद फिर से
टॉम स्टिकेल 23'11

30

यदि आप इसे ठीक से कर रहे हैं और एक मॉडल का उपयोग कर रहे हैं - इन सभी ViewBag weirdos के विपरीत - और अभी भी इस मुद्दे को देखते हुए, क्योंकि यह उन विकल्पों के साथ @Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)मेल नहीं खा सकता है MyValueजिनमें यह है MyOptions। इसके दो संभावित कारण हैं:

  1. MyValueशून्य है। आपने इसे अपने ViewModel में सेट नहीं किया है। में से एक बना MyOptionsएक है Selected=trueइस का समाधान नहीं होगा।
  2. अधिक आसानी से, प्रकार के MyValueमें प्रकार से अलग है MyOptions। तो, जैसे, अगर MyValueहै (int) 1, लेकिन आपके पास MyOptionsगद्देदार तार की एक सूची है {"01", "02", "03", ...}, तो यह स्पष्ट रूप से कुछ भी चयन नहीं करने वाला है।

4
इस उत्तर के लिए बहुत बहुत धन्यवाद। मुझे यह भी समझ में नहीं आता है कि हर कोई एक उचित दृश्य मॉडल बनाने के बजाय ViewBag का उपयोग क्यों कर रहा है। यह जवाब मुझे चेहरे पर घूर रहा था और मैं आपको डॉट्स को जोड़ने की सराहना करता हूं।
अंबिगुइट्स

2
# 2 यहाँ मेरा मुद्दा है। मेरे पास एक मॉडल संपत्ति है जो विधि के नाम पर लेने के लिए एक कस्टम मॉडल बाइंडर के साथ एक प्रतिनिधि प्रकार है और वास्तव में उस विधि को पूर्वनिर्धारित विधि की सूची से बांधती है जो प्रतिनिधि हस्ताक्षर से मेल खाती है। क्या किसी को # 2 के आस-पास काम करने और कुछ हैकी क्लाइंट साइड स्क्रिप्ट के बिना इसे सही ढंग से चुनने के लिए मिला है?
मिकस्चुल

1
एक और हिप्स्टर से धन्यवाद जो व्यू मॉडल्स का उपयोग करता है: D
व्लादिमीर बोजिक

1
इसके अलावा, उदाहरण के लिए विकल्प टैग के बीच प्रदर्शन पाठ की तुलना में एक अलग मूल्य विशेषता के साथ SelectList रखने वाले किसी के लिए <option value="2">some text</option>:। यह वास्तव में डिस्प्ले टेक्स्ट के साथ व्यू मॉडल प्रॉपर्टी से मिलान करने की कोशिश करता है न कि चयनित विकल्प को चुनने के लिए मूल्य विशेषता। यह मुझे थोड़ी देर के लिए जा रहा था।
जेसन हैनसन

17

इस प्रश्न को संबोधित नहीं करते हुए - अगर यह मेरे विचार पथ का अनुसरण करता है, तो भविष्य के गोगलर्स को मदद मिल सकती है:

मैं एक एकाधिक चयन चाहता था और ड्रॉपडाउनलिस्ट पर यह विशेषता हैक ऑटो का चयन नहीं था

Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })

इसके बजाय मुझे ListBoxFor का उपयोग करना चाहिए था जिसने सब कुछ काम किया

Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)

6
मैंने आपके विचार पथ का अनुसरण किया। दुनिया: यदि आप DropDownListFor और कई का उपयोग कर रहे हैं, तो आप ListBoxFor का उपयोग करना चाहते हैं।
स्कॉट स्टैफ़ोर्ड

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

1

मेरे पास भी इसी तरह का मुद्दा है और मैं इसे निम्नानुसार हल करता हूं, सेट करें

मॉडल। आपके नियंत्रक पर संपत्ति चुनता है जिसे आपको चयनित करने की आवश्यकता है

model.States = "कैलिफोर्निया"

और फिर आपको "कैलिफोर्निया" डिफ़ॉल्ट मान के रूप में मिलेगा।


0

यह समस्या आम है। पृष्ठ पर उपयोग किए जाने वाले मॉडल चर नाम को दूसरे के लिए व्यूबैग संपत्ति का नाम बदलें।


0

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


0

मुझे हाल ही में इस मुद्दे का सामना करना पड़ा। इसने मुझे लगभग एक घंटे तक पागल कर दिया। मेरे मामले में, मैं मॉडल प्रॉपर्टी के समान नाम वाले चर का उपयोग नहीं कर रहा थाViewBag

स्रोत नियंत्रण परिवर्तनों को ट्रेस करने के बाद, मुद्दा यह निकला कि मेरी कार्रवाई में मॉडल संपत्ति के समान नाम के साथ एक तर्क था :

public ActionResult SomeAction(string someName)
{
    var model = new SomeModel();
    model.SomeNames = GetSomeList();
    //Notice how the model property name matches the action name
    model.someName = someName; 
}

दृश्य में:

@Html.DropDownListFor(model => model.someName, Model.SomeNames)

मैंने कार्रवाई के तर्क को किसी अन्य नाम में बदल दिया और इसने फिर से काम करना शुरू कर दिया:

public ActionResult SomeAction(string someOtherName)
{
    //....
}

मुझे लगता है कि एक मॉडल का संपत्ति का नाम भी बदल सकता है लेकिन मेरे मामले में, तर्क का नाम अर्थहीन है ...

उम्मीद है कि यह जवाब किसी और को परेशानी से बचाता है।


0

मेरे लिए कम से कम यह मुद्दा बंधा हुआ था IEnumerable<T>

मूल रूप से ऐसा हुआ था कि दृश्य और मॉडल में समान संपत्ति के लिए एक ही संदर्भ नहीं था।

अगर तुम यह करते हो

IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}

फिर इस का उपयोग करके बांधें

@Html.DropDownListFor(model => model.Id, Model.CoolNames)

देखें CoolNames संपत्ति का ट्रैक खो देता है, एक साधारण फिक्स सिर्फ .ToList()एक प्रोजेक्शन (( .Select())) करने के बाद जोड़ना है ।


0

मुझे भी यही समस्या थी। नीचे दिए गए उदाहरण में चर ViewData ["DATA_ACREDITO_MODELO_INTEGRADO"] में एक चयनित चयनित मान के साथ SelectListItem सूची है, लेकिन ऐसी विशेषता नेत्रहीन रूप से परिलक्षित नहीं होती है।

// data 
        var p_estadoAcreditacion = "NO";
        var estadoAcreditacion = new List<SelectListItem>();
        estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)"    , Value = " "    });
        estadoAcreditacion.Add(new SelectListItem { Text = "SI"              , Value = "SI"   });
        estadoAcreditacion.Add(new SelectListItem { Text = "NO"              , Value = "NO"   });

        if (!string.IsNullOrEmpty(p_estadoAcreditacion))
        {
            estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
        }
         ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;

मैंने ड्रॉपडाउनलिस्ट के पहले तर्क को आईडी विशेषता से अलग करके इसे हल किया।

// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"

...


0

मुझे पता है कि यह एक पुराना सवाल है लेकिन मैं 2020 में भी यही मुद्दा रहा हूं।

यह पता चलता है कि यह मुद्दा "टाइटल" कहे जाने वाली मॉडल प्रॉपर्टी के साथ था, मैंने इसका नाम बदलकर "गिवेइटल" रख दिया और यह अब उम्मीद के मुताबिक काम करता है।

से

Html.DropDownListFor(m => m.Title, Model.Titles, "Please Select", new { @class = "form-control" })

सेवा

Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.