ฉันจะเพิ่มรายการใน SelectList ใน ASP.net MVC ได้อย่างไร


112

โดยทั่วไปฉันต้องการแทรกรายการที่จุดเริ่มต้นของ SelectList โดยมีค่าเริ่มต้นเป็น 0 และค่าข้อความเป็น "- Select One -"

สิ่งที่ต้องการ

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

สามารถทำได้หรือไม่?


2
SelectListดูเหมือนจะเป็นเพียงผู้ช่วยในการผูกข้อมูลกับรายการโดยตรง หากคุณเพิ่มรายการด้วยตนเองให้ใช้List<SelectListItem>แทน
Kai Hartmann

จากคำตอบที่ยอมรับและจำนวนคะแนนฉันขอแนะนำให้คุณเปลี่ยนคำถามเล็กน้อยเพื่อให้สอดคล้องกับคำตอบนั้น i, e, "ฉันจะเพิ่มรายการค่าว่างลงใน SelectList ใน ASP.net MVC ได้อย่างไร" แต่ให้เครดิตและขอบคุณ @ h-dog สำหรับการตอบคำถาม "ฉันจะเพิ่มรายการ" เดิมได้อย่างไร
AndrewD

คำตอบ:


150

ไม่จำเป็นต้องทำสิ่งนี้จริงๆเว้นแต่คุณจะยืนยันค่าเป็น 0 ส่วนขยาย HtmlHelper DropDownList ช่วยให้คุณสามารถตั้งค่าป้ายกำกับตัวเลือกที่แสดงเป็นค่าเริ่มต้นในการเลือกด้วยค่า null เพียงใช้หนึ่งในลายเซ็น DropDownList ที่มีป้ายกำกับตัวเลือก

<%= Html.DropDownList( "DropDownValue",
                       (IEnumerable<SelectListItem>)ViewData["Menu"],
                        "-- Select One --" ) %>

1
จะเกิดอะไรขึ้นถ้าคุณยืนยันค่าของ 0? หากค่าเป็น null / สตริงว่างอาจทำให้เกิดปัญหากับการผูกโมเดล
Kjensen

2
หากคุณคาดหวังให้มันกลับมาเป็น int ฉันจะใช้ int? และยังคงปล่อยให้เป็นโมฆะหากไม่มีการเลือก
tvanfosson

13
ปัญหานี้คือวิธีแก้ปัญหาคือคุณทำรายการที่คุณเลือกหาย
37Stars

1
@JesseWebb ฉันสงสัยว่าคุณเพียงแค่ต้องให้แน่ใจว่าคุณกำลังใช้ลายเซ็นที่มีป้ายชื่อตัวเลือกmsdn.microsoft.com/en-us/library/ee703567.aspx , @Html.DropDownListFor( m => m.MenuSelection, (IEnumerable<SelectListItem>)ViewBag.Menu, "Select One", null )ตัวอย่างรวมทั้งโมฆะhtmlAttributesไปสู่ความสับสนหลีกเลี่ยงที่มีลายเซ็น ที่ใช้นิพจน์การแจงนับเมนูและออบเจ็กต์ (htmlAttributes)
tvanfosson

1
@tvanfosson - ขอบคุณสำหรับความกระจ่าง ฉันพยายามใช้กับประเภท Complex เป็นประเภทสำหรับ IEnumerable ใน SelectList ฉันต้องระบุdataValueFieldและสิ่งdataTestFieldที่ทำให้สิ่งนี้ใช้ไม่ได้เมื่อเพิ่มค่า optionLabel อาจใช้ความพยายามมากกว่านี้เล็กน้อย แต่ฉันใช้วิธีแก้ปัญหาทางเลือกอย่างใดอย่างหนึ่ง ยังไงก็ขอบคุณ!
Jesse Webb

82

ฉันทำให้สิ่งนี้ทำงานได้โดยการเติม SelectListItem แปลงเป็นรายการและเพิ่มค่าที่ดัชนี 0

List<SelectListItem> items = new SelectList(CurrentViewSetups, "SetupId", "SetupName", setupid).ToList(); 
items.Insert(0, (new SelectListItem { Text = "[None]", Value = "0" }));
ViewData["SetupsSelectList"] = items;

ฉันแนะนำให้ใช้ optionLabel overload ใน HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

17

สิ่งนี้เป็นไปได้

//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);

ฉันแนะนำให้ใช้ optionLabel overload ใน HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

13

ฉันชอบคำตอบของ @ AshOoO แต่ชอบ @Rajan Rawal ฉันต้องรักษาสถานะรายการที่เลือกไว้ถ้ามี ดังนั้นฉันจึงเพิ่มการปรับแต่งของฉันลงในวิธีการของเขาAddFirstItem()

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);
}

ฉันแนะนำให้ใช้ optionLabel overload ใน 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");
        }

สิ่งนี้ควรทำในสิ่งที่คุณต้องการเพียงแค่ส่งรายการที่เลือกของคุณและมันจะส่งคืนรายการที่เลือกพร้อมกับรายการในดัชนี 0

คุณสามารถดูแลข้อความค่าหรือแม้แต่ดัชนีของรายการที่คุณต้องการแทรกได้


จะเป็นอย่างไรหากฉันมีค่าที่เลือกไว้และต้องการเก็บรักษาไว้
Rajan Rawal

ฉันแนะนำให้ใช้ optionLabel overload ใน HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

5

นี่คือผู้ช่วย html สำหรับคุณ

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;
}

3

วิธีการ. toList (). Insert (.. )จะใส่องค์ประกอบลงในรายการของคุณ สามารถระบุตำแหน่งใดก็ได้ หลังจาก ToList เพียงแค่เพิ่มแทรก (0, "- - รายการแรก - -")

รหัสของคุณ

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

รหัสใหม่

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

2

อาจฟังดูไม่หรูหรามากนัก แต่ฉันมักจะทำสิ่งนี้:

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

1

โอเคฉันชอบรหัสสะอาดดังนั้นฉันจึงสร้างวิธีนี้เป็นส่วนขยาย

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
    }
}

การใช้งาน (ตามตัวอย่าง):

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");

1

เนื่องจากตัวเลือกนี้อาจต้องการในลักษณะที่แตกต่างกันฉันจึงได้ข้อสรุปในการพัฒนาวัตถุเพื่อให้สามารถใช้ในสถานการณ์ต่างๆและในโครงการในอนาคตได้

ก่อนอื่นให้เพิ่มชั้นเรียนนี้ในโครงการของคุณ

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 });                    
    }
}

ตอนนี้ใน Controller Action คุณสามารถทำได้เช่นนี้

    // 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"));

และสุดท้ายใน View คุณจะเขียนโค้ดแบบนี้

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

0

วิธีแก้ปัญหาคือใช้คำตอบของ @ tvanfosson (คำตอบที่เลือก) และใช้ JQuery (หรือ Javascript) เพื่อตั้งค่าตัวเลือกเป็น 0:

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

หวังว่านี่จะช่วยได้


0

ลองใช้รหัสต่อไปนี้:

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");

-5

ฉันไม่ว่าใครจะมีตัวเลือกที่ดีกว่านี้ ...

<% 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=" "})%>
<% }>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.