Html.DropdownListFor चयनित मान सेट नहीं किया जा रहा है


97

मैं Html.DropDownListFor के चयनित मान को कैसे सेट कर सकता हूं? मैं ऑनलाइन देख रहा हूं और देखा है कि इसे चौथे पैरामीटर का उपयोग करके प्राप्त किया जा सकता है ताकि नीचे की तरह:

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

मेरी चयन सूची तब इस तरह प्रदर्शित होती है:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

लेकिन किसी कारण से यूनाइटेड किंगडम का चयन होता है लेकिन मैं चाहता हूं कि "कृपया एक देश का चयन करें" का चयन किया जाए।

किसी को पता है कि मैं इसे कैसे प्राप्त कर सकता हूं?

संपादित करें

मैंने अपना कोड अपडेट कर दिया है क्योंकि कार्यक्षमता में थोड़ा बदलाव था लेकिन अभी भी इस समस्या का सामना करना पड़ रहा है। यह मेरे विचार में है:

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1optionमेरे द्वारा चुनी गई की आईडी है , मैंने भी पाठ के साथ कोशिश की है optionलेकिन वह भी काम नहीं करता है।

कोई विचार?

जवाबों:


181

आपके कोड में कुछ वैचारिक मुद्दे हैं:

सबसे पहले ,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

DropDownListFor का उपयोग करते समय, पहला पैरामीटर वह प्रॉपर्टी है जहां फॉर्म सबमिट करने के बाद आपका चयनित मूल्य संग्रहीत होता है। तो, आपके मामले में, आपके पास SelectedOrderIdइस तरह से इसका उपयोग करने के लिए आपके मॉडल का एक हिस्सा या ऐसा कुछ होना चाहिए :

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

दूसरा ,

ViewBag का उपयोग करने के अलावा, यह गलत नहीं है, लेकिन बेहतर तरीके हैं (इसके बजाय ViewModel में जानकारी डालें), आपकी ViewBag संपत्ति, जहां आप SelectList को पकड़ रहे हैं , वहां "थोड़ा बग" (या अनिर्दिष्ट व्यवहार) है। संपत्ति का वही नाम जहां आप चयनित मूल्य रखते हैं। इससे बचने के लिए, वस्तुओं की सूची रखने वाली संपत्ति का नामकरण करते समय बस एक और नाम का उपयोग करें।

अगर मैं इस मुद्दे से बचने के लिए और बेहतर MVC कोड लिखने के लिए कुछ कोड का उपयोग करूंगा:

viewmodel:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}

नियंत्रक:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}

आपके विचार में:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")

42
मेरा दिन सहेजा गया: "... थोड़ी सी बग तब होती है जब आपकी ViewBag प्रॉपर्टी, जहां आप SelectList को होल्ड कर रहे होते हैं, प्रॉपर्टी का वही नाम होता है, जहां आप सिलेक्टेड वैल्यू डालते हैं। इससे बचने के लिए, प्रॉपर्टी होल्ड का नामकरण करते समय किसी दूसरे नाम का इस्तेमाल करें। वस्तुओं की सूची। " धन्यवाद!
माइकल ए। वोल्ज़ उर्फ ​​फ्लिन

4
यह "छोटी बग" पूर्ण पागलपन है! बस इसी वजह से मेरी जिंदगी के 2 घंटे बर्बाद हो गए। इतना स्पष्ट कुछ भी कैसे मौजूद हो सकता है और पैच नहीं हो सकता है?
केंद्रों

1
फ्लिन, आपकी टिप्पणी वास्तव में एक उत्तर होनी चाहिए। मैंने काम करने के लिए अपनी ड्रॉपडेलिस्ट पाने के लिए पागल कार्यान्वयन की कोशिश की और यह सरल उपाय था
ड्वेन हिंटरलैंग

2
थोड़ा बग है ? यह एक बग बिल्कुल नहीं है। मॉडल बाइंडिंग किसी प्रॉपर्टी की वैल्यू से बाइंडिंग का काम करता है और जब आप टाइप करने के लिए OrderTemplatesअपनी ViewBagप्रॉपर्टी को बाइंड करने की कोशिश करते हैं जो टाइपोफ है IEnumerabe<SelectListItem>। लेकिन एक <select>तत्व जटिल वस्तुओं के संग्रह (केवल एक मूल्य प्रकार) के लिए बाध्य नहीं कर सकता है

पवित्र बकवास अगर मैं इस जवाब के लिए नहीं होता तो मैं एक पूरा दिन बर्बाद कर देता। गंभीरता से कहा जाता है कि लिटल बग है इसलिए हमें व्यूबैग पर जमानत देनी चाहिए
वर्थ 7

22

मेरे लिए काम नहीं कर रहा था इसलिए इस तरह से काम किया:

नियंत्रक:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

राय:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

JQuery:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});

2
आपके नियंत्रक में कोष्ठकों की गलत संख्या है: इसमें एक उद्घाटन कोष्ठक और दो समापन कोष्ठक हैं।
आमोस लॉन्ग

JQuery का तर्क मेरे लिए काम करता है। धन्यवाद।
शशांक

7

जब आप किसी वस्तु को इस तरह पास करते हैं:

new SelectList(Model, "Code", "Name", 0)

आप कह रहे हैं: स्रोत ( Model) और कुंजी ( "Code") पाठ ( "Name") और चयनित मूल्य 0। आपके पास शायद संपत्ति के 0लिए अपने स्रोत में कोई मूल्य नहीं है Code, इसलिए HTML हेल्पर इस नियंत्रण के लिए वास्तविक चयनितवैल्यू पास करने के लिए पहले तत्व का चयन करेगा।


3

सुनिश्चित करें कि आपने असाइन करने से पहले चयनित मूल्य को ट्रिम कर दिया है।

//नमूना

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

// नियंत्रक

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//राय

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })

2

यदि आप जानते हैं कि दृश्य में क्या होगा, तो आप नियंत्रक से डिफ़ॉल्ट मान भी सेट कर सकते हैं, बल्कि इसे दृश्य / cshtml फ़ाइल में सेट कर सकते हैं। HTML की ओर से डिफ़ॉल्ट मान सेट करने की आवश्यकता नहीं है।

नियंत्रक फ़ाइल में।

commission.TypeofCommission = 1;
return View(commission);

.Cshtml फ़ाइल में।

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")

1

आपको क्लास को भूल जाना चाहिए

selectList

अपने नियंत्रक में इसका उपयोग करें :

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

मान का चयन करें:

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

सूची को ViewData में जोड़ें:

ViewBag.CustomerTypes = customerTypes;

अपने दृश्य में इसका उपयोग करें :

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

: में अधिक जानकारी http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc


0

नियंत्रक अनुभाग जोड़ें

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);

Html अनुभाग जोड़ें

   @Html.DropDownList("Orders", null)

एक सरल विधि


एक आसान वैकल्पिक लेनदेन प्रसंस्करण
ibrahim ozboluk

0

मेरे लिए सामान्य समाधान :)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}

0

रिक्त आइटम के साथ ड्रॉपडाउन करने के लिए Linq, चयनित आइटम (100% काम करता है)
(दृढ़ता से टाइप किया गया, त्रुटि के लिए संभावना न्यूनतम) किसी भी मॉडल परिवर्तन बंधन में परिलक्षित होंगे

नियंत्रक

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

राय

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

बाध्यकारी डेटा के लिए यह विधि भी संभव है

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });

var selList = CompTypeList.Select (s => new SelectListItem {Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString (), चयनित = s .CompTyp_Id == 3; सत्य: असत्य})।

0

मुझे पता है कि यह वास्तव में सवाल का जवाब नहीं है, लेकिन मैं इस पोस्ट पर ठोकर खाते हुए देखने पर मक्खी पर एक सूची से DropDownList को इनिशियलाइज़ करने का तरीका ढूंढ रहा था।

मेरी गलती यह थी कि मैंने इस तरह से शब्दकोश से एक चयन सूची बनाने की कोशिश की:

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

मैं तो आधिकारिक msdn डॉक्टर में खुदाई करने चला गया , और पाया कि DropDownListForजरूरी नहीं कि एक की जरूरत है SelectList, बल्कि IEnumerable<SelectListItem>:

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

मेरे मामले में मैं शायद Model.Localityचयनित आइटम के रूप में छोड़ सकता हूं , क्योंकि इसकी ए) एकमात्र आइटम और बी) यह पहले से ही SelectListItem.Selectedसंपत्ति में कहती है ।

यदि आप सोच रहे हैं, तो डेटा स्रोत एक AJAX पेज है, जिसे SelectWoo / Select2 नियंत्रण का उपयोग करके गतिशील रूप से लोड किया जाता है।


0
public byte UserType
public string SelectUserType

आपको एक प्राप्त करने और अलग सेट करने की आवश्यकता है। चयनित मूल्य वही आइटम नहीं हो सकता है जिसे आप सेट करने वाले हैं।

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

मैं अपनी सूची के लिए Enum शब्दकोश का उपयोग करता हूं, यही कारण है कि "कुंजी", "मूल्य" जोड़ी है।


0

मेरे पास एक समान मुद्दा था, मैं ViewBag और तत्व नाम का समान उपयोग कर रहा था। (टाइपिंग करने में गलती)


0

यह सीएसएस मुद्दों है। मैं नहीं जानता कि क्यों @ Html.DropDownListFor बूटस्ट्रैप में 4 doest काम करते हैं। निश्चित रूप से यह वर्ग डिजाइन की समस्या है। वैसे भी काम के आस-पास है, अगर आपके ड्रॉपडाउन इनपुट बॉक्स में CSS पैडिंग है: #px, # px; तत्व तब इसे अक्षम करें। उम्मीद है कि यह काम करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.