Bagaimana cara menambahkan item ke SelectList di ASP.net MVC

112

Pada dasarnya saya ingin memasukkan item di awal SelectList dengan nilai default 0 dan Nilai Teks "- Select One -"

Sesuatu seperti

SelectList list = new SelectList(repository.func.ToList());
ListItem li = new ListItem(value, value);
list.items.add(li);

Bisakah ini dilakukan?

GEOCHET
sumber
2
SelectListbenar-benar tampaknya hanya pembantu untuk mengikat data secara langsung ke item. Jika Anda menambahkan item secara manual gunakan List<SelectListItem>saja.
Kai Hartmann
Mengingat jawaban yang diterima dan jumlah suara, dapatkah saya menyarankan Anda mengubah pertanyaan sedikit untuk mencerminkan jawaban i, e, "Bagaimana cara menambahkan item bernilai kosong ke SelectList di ASP.net MVC"? Tapi penghargaan & terima kasih kepada @ h-dog karena menjawab pertanyaan asli "Bagaimana saya bisa menambahkan item" per se
AndrewD

Jawaban:

150

Sebenarnya tidak perlu melakukan ini kecuali jika Anda bersikeras pada nilai 0. Ekstensi HtmlHelper DropDownList memungkinkan Anda menyetel label opsi yang muncul sebagai nilai awal dalam pemilihan dengan nilai null. Cukup gunakan salah satu tanda tangan DropDownList yang memiliki label opsi.

<%= Html.DropDownList( "DropDownValue",
                       (IEnumerable<SelectListItem>)ViewData["Menu"],
                        "-- Select One --" ) %>
tvanfosson.dll
sumber
1
Bagaimana jika Anda benar-benar bersikeras pada nilai 0? Jika nilainya null / string kosong, ini dapat menyebabkan masalah dengan pengikatan model.
Kjensen
2
Jika Anda mengharapkannya kembali sebagai int, maka saya akan menggunakan int? dan tetap kosongkan jika tidak ada pilihan yang dibuat.
tvanfosson
13
Masalah dengan ini adalah solusinya adalah Anda kehilangan item yang Anda pilih.
37Stars
1
@JesseWebb Saya menduga Anda hanya perlu memastikan Anda menggunakan tanda tangan yang menyertakan label opsi, msdn.microsoft.com/en-us/library/ee703567.aspx , @Html.DropDownListFor( m => m.MenuSelection, (IEnumerable<SelectListItem>)ViewBag.Menu, "Select One", null )misalnya, termasuk null htmlAttributesuntuk menghindari kebingungan dengan tanda tangan yang mengambil ekspresi, enumerasi menu, dan objek (htmlAttributes).
tvanfosson
1
@tvanfosson - Terima kasih telah mengklarifikasi. Saya mencoba menggunakannya dengan tipe Kompleks sebagai tipe untuk IEnumerable di SelectList. Saya harus menentukan dataValueFielddan dataTestFieldyang membuat ini tidak bekerja saat menambahkan nilai optionLabel. Ini mungkin bisa bekerja dengan sedikit usaha tetapi saya hanya menggunakan salah satu solusi alternatif. Terima kasih!
Jesse Webb
82

Saya mendapatkan ini untuk bekerja dengan Mengisi SelectListItem, mengonversi ke Daftar, dan menambahkan nilai pada indeks 0.

List<SelectListItem> items = new SelectList(CurrentViewSetups, "SetupId", "SetupName", setupid).ToList(); 
items.Insert(0, (new SelectListItem { Text = "[None]", Value = "0" }));
ViewData["SetupsSelectList"] = items;
davewilliams459
sumber
Saya sarankan menggunakan overload optionLabel di HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5
17

Ini mungkin.

//Create the select list item you want to add
SelectListItem selListItem = new SelectListItem() { Value = "null", Text = "Select One" };

//Create a list of select list items - this will be returned as your select list
List<SelectListItem> newList = new List<SelectListItem>();

//Add select list item to list of selectlistitems
newList.Add(selListItem);

//Return the list of selectlistitems as a selectlist
return new SelectList(newList, "Value", "Text", null);
eaf
sumber
Saya sarankan menggunakan overload optionLabel di HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5
13

Saya menyukai jawaban @ AshOoO tetapi seperti @Rajan Rawal, saya harus mempertahankan status item yang dipilih, jika ada. Jadi saya menambahkan penyesuaian saya ke metodenyaAddFirstItem()

public static SelectList AddFirstItem(SelectList origList, SelectListItem firstItem)
{
    List<SelectListItem> newList = origList.ToList();
    newList.Insert(0, firstItem);

    var selectedItem = newList.FirstOrDefault(item => item.Selected);
    var selectedItemValue = String.Empty;
    if (selectedItem != null)
    {
        selectedItemValue = selectedItem.Value;
    }

    return new SelectList(newList, "Value", "Text", selectedItemValue);
}
H Anjing
sumber
Saya sarankan menggunakan overload optionLabel di HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5
5
private SelectList AddFirstItem(SelectList list)
        {
            List<SelectListItem> _list = list.ToList();
            _list.Insert(0, new SelectListItem() { Value = "-1", Text = "This Is First Item" });
            return new SelectList((IEnumerable<SelectListItem>)_list, "Value", "Text");
        }

Ini Harus melakukan apa yang Anda butuhkan, cukup kirim daftar pilih Anda dan itu akan mengembalikan daftar pilih dengan item dalam indeks 0

Anda dapat memilih teks, nilai atau bahkan indeks item yang perlu Anda masukkan

AshOoO
sumber
bagaimana jika saya memiliki beberapa nilai yang dipilih dan saya ingin melestarikannya?
Rajan Rawal
Saya sarankan menggunakan overload optionLabel di HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5
5

Berikut pembantu html untuk Anda

public static SelectList IndividualNamesOrAll(this SelectList Object)
{
    MedicalVarianceViewsDataContext LinqCtx = new MedicalVarianceViewsDataContext();

    //not correct need individual view!
    var IndividualsListBoxRaw =  ( from x in LinqCtx.ViewIndividualsNames 
                                 orderby x.FullName
                                 select x);

    List<SelectListItem> items = new SelectList (
                               IndividualsListBoxRaw, 
                              "First_Hospital_Case_Nbr", 
                              "FullName"
                               ).ToList();

    items.Insert(0, (new SelectListItem { Text = "All Individuals", 
                                        Value = "0.0", 
                                        Selected = true }));

    Object = new SelectList (items,"Value","Text");

    return Object;
}
tersembunyi
sumber
3

Metode .ToList (). Insert (..) menempatkan elemen ke dalam Daftar Anda. Posisi apa pun dapat ditentukan. Setelah ToList tambahkan saja .Insert (0, "- - First Item - -")

Kode Anda

SelectList list = new SelectList(repository.func.ToList());
ListItem li = new ListItem(value, value);
list.items.add(li);

Kode Baru

SelectList list = new SelectList(repository.func.ToList().Insert(0, "- - First Item - -"));
ListItem li = new ListItem(value, value);
list.items.add(li);
Moji
sumber
2

Mungkin kedengarannya tidak elegan, tetapi saya biasanya melakukan sesuatu seperti ini:

    var items = repository.func.ToList();
    items.Insert(0, new funcItem { ID = 0, TextValue = "[None]" });
    ViewBag.MyData = new SelectList(items);
Androiderson
sumber
1

Oke saya suka kode bersih jadi saya membuat ini metode ekstensi

static public class SelectListHelper
{
    static public SelectList Add(this SelectList list, string text, string value = "", ListPosition listPosition = ListPosition.First)
    {
        if (string.IsNullOrEmpty(value))
        {
            value = text;
        }
        var listItems = list.ToList();
        var lp = (int)listPosition;
        switch (lp)
        {
            case -1:
                lp = list.Count();
                break;
            case -2:
                lp = list.Count() / 2;
                break;
            case -3:
                var random = new Random();
                lp = random.Next(0, list.Count());
                break;
        }
        listItems.Insert(lp, new SelectListItem { Value = value, Text = text });
        list = new SelectList(listItems, "Value", "Text");
        return list;
    }

    public enum ListPosition
    {
        First = 0,
        Last = -1,
        Middle = -2,
        Random = -3
    }
}

Penggunaan (dengan contoh):

var model = new VmRoutePicker
    {
     Routes =
     new SelectList(_dataSource.Routes.Select(r => r.RouteID).Distinct())
     };                                     
  model.Routes = model.Routes.Add("All", "All", SelectListHelper.ListPosition.Random);
//or
  model.Routes = model.Routes.Add("All");
Jeff
sumber
1

Karena opsi ini mungkin perlu dalam banyak cara yang berbeda, saya mencapai kesimpulan untuk mengembangkan sebuah objek sehingga dapat digunakan dalam skenario yang berbeda dan dalam proyek-proyek mendatang

pertama tambahkan kelas ini ke proyek Anda

public class SelectListDefaults
{
    private IList<SelectListItem> getDefaultItems = new List<SelectListItem>();

    public SelectListDefaults()
    {
        this.AddDefaultItem("(All)", "-1");
    }
    public SelectListDefaults(string text, string value)
    {
        this.AddDefaultItem(text, value);
    }
    public IList<SelectListItem> GetDefaultItems
    {
        get
        {                
            return getDefaultItems;
        }

    }
    public void AddDefaultItem(string text, string value)
    {        
        getDefaultItems.Add(new SelectListItem() { Text = text, Value = value });                    
    }
}

Sekarang di Controller Action Anda bisa melakukan seperti ini

    // Now you can do like this
    ViewBag.MainCategories = new SelectListDefaults().GetDefaultItems.Concat(new SelectList(db.MainCategories, "MainCategoryID", "Name", Request["DropDownListMainCategory"] ?? "-1"));
    // Or can change it by such a simple way
    ViewBag.MainCategories = new SelectListDefaults("Any","0").GetDefaultItems.Concat(new SelectList(db.MainCategories, "MainCategoryID", "Name", Request["DropDownListMainCategory"] ?? "0"));
    // And even can add more options
    SelectListDefaults listDefaults = new SelectListDefaults();
    listDefaults.AddDefaultItme("(Top 5)", "-5");
    // If Top 5 selected by user, you may need to do something here with db.MainCategories, or pass in parameter to method 
    ViewBag.MainCategories = listDefaults.GetDefaultItems.Concat(new SelectList(db.MainCategories, "MainCategoryID", "Name", Request["DropDownListMainCategory"] ?? "-1"));

Dan akhirnya di View Anda akan membuat kode seperti ini.

@Html.DropDownList("DropDownListMainCategory", (IEnumerable<SelectListItem>)ViewBag.MainCategories, new { @class = "form-control", onchange = "this.form.submit();" })
sairfan
sumber
0

Solusinya adalah dengan menggunakan jawaban @ tvanfosson (jawaban yang dipilih) dan menggunakan JQuery (atau Javascript) untuk menyetel nilai opsi ke 0:

$(document).ready(function () {
        $('#DropDownListId option:first').val('0');
    });

Semoga ini membantu.

logis
sumber
0

Coba sesuatu seperti kode berikut:

MyDAO MyDAO = new MyDAO();    
List<MyViewModel> _MyDefault = new List<MyViewModel>() {
                new MyViewModel{
                    Prop1= "All",
                    Prop2 = "Select all"
                }
            };
            ViewBag.MyViewBag= 
                new SelectList(MyDAO
                .MyList().Union(
                    _MyDefault
                    ), "Prop1", "Prop2");
Enrique Mingyar Torrez Hinojos
sumber
-5

Saya tidak jika orang lain memiliki pilihan yang lebih baik ...

<% if (Model.VariableName == "" || Model.VariableName== null) { %>
   <%= html.DropDpwnList("ListName", ((SelectList) ViewData["viewName"], "", 
        new{stlye=" "})%>
<% } else{ %>
<%= html.DropDpwnList("ListName", ((SelectList) ViewData["viewName"], 
        Model.VariableName, new{stlye=" "})%>
<% }>
Baru2ini
sumber