मुझे यह ASP.NET MVC SelectList कैसे काम कर सकता है?


126

मैं दृश्य में प्रदर्शित करने के लिए, अपने नियंत्रक में एक चयन सूची बनाता हूं।

मैं इसे मक्खी, सॉर्ट बात पर बनाने की कोशिश कर रहा हूँ .. इस तरह ...

myViewData.PageOptionsDropDown = 
   new SelectList(new [] {"10", "15", "25", "50", "100", "1000"}, "15");

यह संकलन करता है, लेकिन आउटपुट खराब है ...

<select id="PageOptionsDropDown" name="PageOptionsDropDown">
    <option>10</option>
    <option>15</option>
    <option>25</option>
    <option>50</option>
    <option>100</option>
    <option>1000</option>
</select>

ध्यान दें कि कोई आइटम कैसे चुना जाता है?

मैं इसे कैसे ठीक करूं??


1
छह उत्तर ... एक इष्ट ... कोई अपवित्र नहीं: / मैं इसे 1
womp

जवाबों:


128

यह मेरा इसे करने का तरीका है

IList<Customer> customers = repository.GetAll<Customer>();
IEnumerable<SelectListItem> selectList = 
    from c in customers
    select new SelectListItem
    {
        Selected = (c.CustomerID == invoice.CustomerID),
        Text = c.Name,
        Value = c.CustomerID.ToString()
    };

दूसरी नज़र में मुझे यकीन नहीं है कि मुझे पता है कि आप आखिर क्या हैं ...


2
धन्यवाद, इससे मुझे इस सामान का पता लगाने में मदद मिली।
कैडू

6
चयनित आइटम समस्या को ठीक नहीं करता है, लेकिन यह चुनिंदा सूचियों के लिए जादुई तार से बचने का एक शानदार तरीका है! चीयर्स
एलन क्रिस्टेंसन

11
चयनित आइटम समस्या को ठीक करने के लिए, निम्न कोड जोड़ें: SelectList sList = new SelectList(selectList, "Text", "Value", selected);जहां selectedमौजूदा चयनित ग्राहक है
jao

68

मैं एक एक्सटेंशन विधि का उपयोग करता हूं:

प्रयोग

var departmentItems = departments.ToSelectList(d => d.Code + 
                                               " - " + d.Description,
                                               d => d.Id.ToString(),
                                               " - ");

var functionItems = customerFunctions.ToSelectList(f => f.Description, 
                                                   f => f.Id.ToString(), 
                                                   " - ");

साथ में

public static class MCVExtentions
{
    public static List<SelectListItem> ToSelectList<T>(
        this IEnumerable<T> enumerable, 
        Func<T, string> text, 
        Func<T, string> value, 
        string defaultOption)
    {
        var items = enumerable.Select(f => new SelectListItem()
                                     {
                                         Text = text(f), 
                                         Value = value(f) 
                                     }).ToList();
        items.Insert(0, new SelectListItem()
                    {
                        Text = defaultOption, 
                        Value = "-1" 
                    });
        return items;
    }
}

अच्छा। मैंने एक निर्दिष्ट फ़ंड, एक डिफॉल्ट वेल्यू विकल्प और दूसरा ओवरलोड बिना किसी चूक के निर्दिष्ट किया है और यह एक उपचार का काम करता है। वैसे यदि आप रिटर्न टाइप करना चाहते हैं तो IEnumerable <SelectListItem> आप इस लुक को वास्तव में साफ बनाने के लिए यील्ड रिटर्न सिंटैक्स का उपयोग कर सकते हैं
क्रिस मेक

48

निर्माणकर्ता का उपयोग करना जो items, dataValueField, dataTextField, selectedValueमापदंडों के रूप में स्वीकार करता है:

ViewData["myList"] = 
                new SelectList(new[] { "10", "15", "25", "50", "100", "1000" }
                .Select(x => new {value = x, text = x}), 
                "value", "text", "15");

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

<%=Html.DropDownList("myList") %>

3
अच्छा दोस्त :) मुझे पसंद है! मैं यह करने की कोशिश कर रहा था .. लेकिन मैं नहीं मिल सका। चयन (..) भाग .. अच्छा :) मैं इसे घर पर
आज़माऊँगा

1
हय कगदस। महान काम करता है, सिवाय चयनित क्षेत्र के चयनित नहीं है। कोई उपाय? यह MVC सामान में एक बग है?
प्योर.क्रोम

2
चयनित आइटम तब काम करता है जब आप SelectList आइटम को ViewData ऑब्जेक्ट (ViewData ["myList"] = new SelectList ..) में जोड़ते हैं और फिर उसे <% = Html.DropDownList ("mylist")%> के साथ प्रस्तुत करते हैं। मुझे इस तरह से काम किए बिना चयनित आइटम नहीं मिल सकता है। अजीब।
9ağdaş Tekin

@Cagdas - हाय फिर से दोस्त .. मैं अभी भी इस बाहर :( क्या एक ViewData ??? मैं एक जोरदार टाइप किया ViewData के साथ यह अपनी संपत्ति .... ??? के बारे में इस है सोचा नहीं किया है
Pure.Krome

@ Pure.Krome - मैंने आपके उदाहरण से उस संपत्ति को प्रश्न में ले लिया। अब मैं कोड नमूना संपादित कर रहा हूं। कृपया कुछ सेकंड में मेरा संपादन देखें।
9ağdaş Tekin

19

थॉमस स्टॉक के जवाब से दूर, मैंने इन अतिभारित ToSelectListतरीकों को बनाया :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

public static partial class Helpers
{
    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, bool selectAll = false)
    {
        return enumerable.ToSelectList(value, value, selectAll);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, object selectedValue)
    {
        return enumerable.ToSelectList(value, value, new List<object>() { selectedValue });
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, IEnumerable<object> selectedValues)
    {
        return enumerable.ToSelectList(value, value, selectedValues);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, Func<T, object> text, bool selectAll = false)
    {
        foreach (var f in enumerable.Where(x => x != null))
        {
            yield return new SelectListItem()
            {
                Value = value(f).ToString(),
                Text = text(f).ToString(),
                Selected = selectAll
            };
        }
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, Func<T, object> text, object selectedValue)
    {
        return enumerable.ToSelectList(value, text, new List<object>() { selectedValue });
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, Func<T, object> text, IEnumerable<object> selectedValues)
    {
        var sel = selectedValues != null
            ? selectedValues.Where(x => x != null).ToList().ConvertAll<string>(x => x.ToString())
            : new List<string>();

        foreach (var f in enumerable.Where(x => x != null))
        {
            yield return new SelectListItem()
            {
                Value = value(f).ToString(),
                Text = text(f).ToString(),
                Selected = sel.Contains(value(f).ToString())
            };
        }
    }
}

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

var pageOptions = new[] { "10", "15", "25", "50", "100", "1000" };
ViewBag.PageOptions = pageOptions.ToSelectList(o => o, "15" /*selectedValue*/);

और अंत में आपके विचार में, डाल:

@Html.DropDownList("PageOptionsDropDown", ViewBag.PageOptions as IEnumerable<SelectListItem>, "(Select one)")

यह वांछित आउटपुट में परिणाम देगा - निश्चित रूप से, "(Select one)"यदि आप पहले खाली आइटम नहीं चाहते हैं, तो आप विकल्पलेबेल को छोड़ सकते हैं:

<select id="PageOptionsDropDown" name="PageOptionsDropDown">
<option value="">(Select one)</option>
<option value="10">10</option>
<option selected="selected" value="15">15</option>
<option value="25">25</option>
<option value="50">50</option>
<option value="100">100</option>
<option value="1000">1000</option>
</select>

अद्यतन: एक संशोधित कोड सूची यहां XML टिप्पणियों के साथ मिल सकती है ।


13

समस्या यह है, SelectList डिजाइन के रूप में काम करता है। बग डिजाइन में है। आप चयनित संपत्ति को चयनित इटेम में सेट कर सकते हैं, लेकिन यह पूरी तरह से नजरअंदाज कर दिया जाएगा, यदि आप सूची को गेटइंटररेटर () के साथ या (अगर आपके लिए Mvc करता है)। Mvc इसके बजाय नए SelectListItems बनाएगा।

आपको SelectListItem [], Text-Name, Value-Name और SelectValue के साथ SelectList ctor का उपयोग करना होगा। SelectVistue के मूल्य के रूप में SelectValue पास करने के लिए जागरूक रहें, जिसे आप चयनित करना चाहते हैं, न कि SelectListItem! उदाहरण:

SelectList sl = new SelectList( new[]{
  new SelectListItem{ Text="one", Value="1"},
  new SelectListItem{ Text="two", Value="2"},
  new SelectListItem{ Text="three", Value="3"}
}, "Text", "Value", "2" );

(यह परीक्षण नहीं किया गया था, लेकिन मुझे भी यही समस्या थी)

तब 2 विकल्प को चयनित = "चयनित" विशेषता मिलेगी। यह अच्छा पुराने डेटासेट की तरह दिखता है ;;;


11

यह एक विकल्प है:

myViewData.PageOptionsDropDown = new[] 
{
 new SelectListItem { Text = "10", Value = "10" },
 new SelectListItem { Text = "15", Value = "15", Selected = true }
 new SelectListItem { Text = "25", Value = "25" },
 new SelectListItem { Text = "50", Value = "50" },
 new SelectListItem { Text = "100", Value = "100" },
 new SelectListItem { Text = "1000", Value = "1000" },
}

नया SelectListItem {चयनित = सही, पाठ = "15", चयनित मूल्य के लिए मान = "15"}।
कैडू

उफ़, हाँ, की चुनी गई 'संपत्ति, धन्यवाद Cadoo =) शामिल करना भूल
murki

10

यदि यह सचमुच आप सभी करना चाहते हैं तो सिर्फ ऐरे को स्ट्रिंग घोषित करना है जो चयनित आइटम समस्या को ठीक करता है:

myViewData.PageOptionsDropDown = 
   new SelectList(new string[] {"10", "15", "25", "50", "100", "1000"}, "15");

7

SelectList और SelectValue को एक साथ काम करना बहुत आसान है, भले ही आपकी संपत्ति एक इंट, स्ट्रिंग या एक डबल मूल्य जैसी सरल वस्तु नहीं है।

उदाहरण:

हमारे क्षेत्र की वस्तु को कुछ इस तरह से मान लें:

public class Region {
     public Guid ID { get; set; }
     public Guid Name { get; set; }
}

और आपका दृश्य मॉडल कुछ इस तरह है:

public class ContactViewModel {
     public DateTime Date { get; set; }
     public Region Region { get; set; }
     public List<Region> Regions { get; set; }
}

आपके पास नीचे कोड हो सकता है:

@Html.DropDownListFor(x => x.Region, new SelectList(Model.Regions, "ID", "Name")) 

केवल अगर आप इस क्षेत्र की ToString विधि को ओवरराइड करते हैं, जैसे कि:

public class Region {
     public Guid ID { get; set; }
     public Guid Name { get; set; }

     public override string ToString()
     {
         return ID.ToString();
     }
}

यह काम करने के लिए 100% गारंटी है।

लेकिन मैं वास्तव में आइटम संग्रह पर प्रत्येक आइटम के खिलाफ DropDownList या ListBox संपत्ति मूल्य का परीक्षण करने के लिए बराबरी विधि का उपयोग करके सभी सर्किट में सेलेक्टलिस्ट 100% काम करने का सबसे अच्छा तरीका मानता हूं।


5

ऐसा लगता है कि यदि आपके पास एक दृढ़ता से टाइप किया गया दृश्य है, तो आपको ड्रॉपडाउन की आईडी बदलने की आवश्यकता है ताकि यह विरासत में मिली संपत्ति पर संपत्ति का नाम न हो। फिर आपको अपने बदलाव को करने से पहले अपने संपादित (POST) विधि में कुछ तर्क रखने की जरूरत है, ताकि FORMCollection से चयनित मूल्य को खींच कर अपने उदाहरण पर रख सकें।

यह निश्चित रूप से थोड़ा अजीब है, लेकिन मैंने इसे आज़माया और यह काम करता है।

इसलिए यदि आपके पास एक क्षेत्र है जिसमें CountryId कहा जाता है, और आप देश के नामों की एक सूची प्रदर्शित कर रहे हैं, तो ड्रॉपडाउन में CountryId के बजाय CountryName की एक आईडी है, तो पोस्ट में, आप संग्रह ["CountryName] के साथ कुछ कर सकते हैं ।


1
हां, मुझे भी यही समस्या थी। बस नाम बदलकर काम किया। धन्यवाद!
20

4

मेरे साथ भी ठीक यही समस्या थी। समाधान सरल है। बस ड्रॉपडाउनलिस्ट हेल्पर को दिए गए "नाम" पैरामीटर को उस चीज़ में बदलें, जो आपके ViewModel में मौजूद किसी भी गुण से मेल नहीं खाती है। यहाँ और अधिक पढ़ें: http://www.dotnetguy.co.uk/post/2009/06/25/net-mvc-selectlists-selected-value-does-not-get-set-in-the-view

मैं डैन वॉटसन को उद्धृत करता हूं:

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

चियर्स!


3

ये सभी उत्तर बहुत अच्छे लगते हैं, लेकिन ऐसा लगता है कि नियंत्रक एक प्रसिद्ध संरचित प्रारूप में एक दृश्य के लिए डेटा तैयार कर रहा है। इस दृश्य को केवल एक IEnumerable को पुनरावृत्त करने देता है <> मॉडल के माध्यम से वितरित किया गया और एक मानक चयन सूची का निर्माण करें फिर DefaultMelelBinder करें। किसी एक्शन पैरामीटर के माध्यम से चयनित आइटम को वापस आप तक पहुँचाएँ। हाँ, नहीं, क्यों नहीं? चिंताओं का पृथक्करण, हाँ? कुछ यूआई और विशिष्ट देखने के लिए नियंत्रक के लिए अजीब लगता है।


3

सरल:

string[] someName = new string[] {"10", "15", "25", "50", "100", "1000"};
myViewData.PageOptionsDropDown = new SelectList(someName, "15");

2

मैं बस इसे इस तरह से चलाता था और कोई समस्या नहीं थी,

public class myViewDataObj
    {
        public SelectList PageOptionsDropDown { get; set; }
    }

public ActionResult About()
        {
            myViewDataObj myViewData = new myViewDataObj();
            myViewData.PageOptionsDropDown =
                  new SelectList(new[] { "10", "15", "25", "50", "100", "1000" }, "15");

            ViewData["myList"] = myViewData.PageOptionsDropDown;
            return View();
        }

तथा

<%=Html.DropDownList("myList") %>

यह भी काम किया अगर आप ऐसा करते हैं,

public ActionResult About()
        {
            myViewDataObj myViewData = new myViewDataObj();
            myViewData.PageOptionsDropDown =
                  new SelectList(new[] { "10", "15", "25", "50", "100", "1000" });

            ViewData["myListValues"] = myViewData.PageOptionsDropDown;
            ViewData["myList"] = "15";
            return View();
        }

तथा

<%=Html.DropDownList("myList",(IEnumerable<SelectListItem>)ViewData["myListValues"]) %>

1

आपके उदाहरण का उपयोग करना मेरे लिए काम कर रहा है:

नियंत्रक:

ViewData["PageOptionsDropDown"] = new SelectList(new[] { "10", "15", "25", "50", "100", "1000" }, "15");

राय:

<%= Html.DropDownList("PageOptionsDropDown")%>

हां मेरे लिए भी यही काम कर रहा है। मेरे मामले में, सूची एक इकाई मॉडल वस्तु है। नियंत्रक: ViewData ["श्रेणियाँ"] = नया चयनकर्ता (db.Categories.ToList) (), "श्रेणी आई", "श्रेणीनाम", "15"); देखें: Html.DropDownList ("कैटिगरी", (सेलेक्टिस्ट) ViewData ["श्रेणियाँ"], "
--select--

1
MonthRepository monthRepository = new MonthRepository();
IQueryable<MonthEntity> entities = monthRepository.GetAllMonth();
List<MonthEntity> monthEntities = new List<MonthEntity>();

foreach(var r in entities)
{
    monthEntities.Add(r);
}

ViewData["Month"] = new SelectList(monthEntities, "MonthID", "Month", "Mars");

1

मैं इसे इस तरह से करता हूं:

List<SelectListItem> list = new List<SelectListItem>{
new SelectListItem {Selected = true, Text = "Select", Value = "0"},
new SelectListItem {Selected = true, Text = "1", Value = "1"},
new SelectListItem {Selected = true, Text = "2", Value = "2"}
};
return list.ToArray();

ToArray () समस्याओं का ख्याल रखता है।


1

यदि आप अपने DropDownList के लिए कुछ यादृच्छिक पाठ पास करना चाहते हैं, उदाहरण के लिए --Select-- आप इस कोड का उपयोग करके इसे आसान कर सकते हैं:

@Html.DropDownListFor(x => x.CategoryId, new SelectList(Model.Categories, "Id", "Name"), "--Select--", new { @class = "form-control" })


0

मॉडल में चयनित मूल्य डिफ़ॉल्ट आइटम के बजाय लाभ लेता है। (मैं सहमत हूं कि मैंने सभी पोस्ट नहीं पढ़ी हैं)


0

मुझे याद नहीं है कि mvc 1 कैसे सेटअप किया गया था, लेकिन ऐसा लगता है कि यह उसी क्षेत्र के नाम की चयन सूची चाहता था जिसका वह क्षेत्र भी हो ...

मैंने जो पाया, जैसा कि ऊपर किसी ने कहा है, यह है कि मेरी चुनिंदा सूचियां mvc2 में काम नहीं कर रही थीं जब ViewData उन्हें भेजा गया था जैसा कि क्षेत्र के रूप में नामित किया गया था।

उदाहरण के लिए:

<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForName"]) %>

कब काम करता है

<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForID"]) %>

ViewData नाम के रूप में काम नहीं करता है "ForID" को उसी क्षेत्र का नाम दिया गया है जिस क्षेत्र के लिए वह काम कर रहा है


0

एक संभावित व्याख्या यह है कि आपके द्वारा चयन किया जाने वाला चयन सूची मान स्ट्रिंग नहीं है।

तो उस उदाहरण में, क्या पैरामीटर 'PageOptionsDropDown' आपके मॉडल में एक स्ट्रिंग है? क्योंकि अगर ऐसा नहीं है तो सूची में चयनित मूल्य नहीं दिखाया जाएगा।


0

यदि आप Html.DropDownList एक्सटेंशन विधि में MVC 2 के लिए स्रोत कोड में देखते हैं, तो यह कभी भी SelectList वर्ग SelectValue गुण की जांच नहीं करता है। यह केवल आपके मॉडल के विरुद्ध मिलान करने का प्रयास करेगा।

उपरोक्त सभी एक विषय पर सभी विविधताएं हैं, यानी आप ड्रॉप-डाउन सूची के लिए दृश्य में डेटा का एक गुच्छा कैसे भेजते हैं और वे सभी एक दूसरे के रूप में अच्छे हैं (अधिक-या-कम)।

समस्या दृश्य में है। या तो अपना स्वयं का DropDownList एक्सटेंशन विधि बनाएं, जो आपके द्वारा चुने गए चयन का सम्मान करता है, या हाथ से पुनरावृति करता है। जो कभी भी आपके लिए सबसे अच्छा काम करता है।


@ फ्रांज एंट्सबर्गर बहुत कुछ यही कहते हैं।
साइमन हैल्सी

0

यदि आपके पास अपने मॉडल में एक संग्रह है और आपका दृश्य दृढ़ता से टाइप है, तो इसका कुछ भिन्न रूप काम करेगा:

@Html.DropDownListFor(x => x.RegionID, 
    new SelectList(Model.Regions,"RegionID", "RegionName", Model.RegionID))

-या-

@Html.DropDownList("RegionID", 
    new SelectList(Model.Regions, "RegionID", "RegionName", Model.RegionID))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.