Làm cách nào để thêm một mục vào SelectList trong ASP.net MVC


112

Về cơ bản, tôi đang tìm cách chèn một mục vào đầu SelectList với giá trị mặc định là 0 và Giá trị văn bản là "- Select One -"

Cái gì đó như

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

Điều này có thể được thực hiện?


2
SelectListthực sự dường như chỉ là một người trợ giúp để liên kết dữ liệu trực tiếp với các mục. Nếu bạn thêm các mục theo cách thủ công, hãy sử dụng List<SelectListItem>thay thế.
Kai Hartmann

Với câu trả lời được chấp nhận và số phiếu bầu, tôi có thể đề nghị bạn thay đổi câu hỏi một chút để phản ánh câu trả lời đó i, e, "Làm cách nào để thêm mục có giá trị trống vào SelectList trong ASP.net MVC"? Nhưng tín dụng và cảm ơn @ h-dog vì đã trả lời câu hỏi ban đầu "Làm cách nào để thêm một mặt hàng"
AndrewD

Câu trả lời:


150

Thực sự không cần thiết phải làm điều này trừ khi bạn nhấn mạnh vào giá trị bằng 0. Phần mở rộng HtmlHelper DropDownList cho phép bạn đặt nhãn tùy chọn hiển thị dưới dạng giá trị ban đầu trong vùng chọn với giá trị null. Chỉ cần sử dụng một trong các chữ ký DropDownList có nhãn tùy chọn.

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

1
Điều gì sẽ xảy ra nếu bạn thực sự nhấn mạnh vào giá trị của 0? Nếu giá trị là null / một chuỗi rỗng, nó có thể gây ra sự cố với liên kết mô hình.
Kjensen

2
Nếu bạn đang mong đợi nó trở lại dưới dạng int, thì tôi sẽ sử dụng int? và vẫn để trống nếu không có lựa chọn nào được thực hiện.
tvanfosson

13
Vấn đề với giải pháp này là bạn bị mất mục đã chọn.
37Stars

1
@JesseWebb Tôi nghi ngờ bạn chỉ cần đảm bảo rằng bạn đang sử dụng chữ ký bao gồm nhãn tùy chọn , ví dụ: msdn.microsoft.com/en-us/library/ee703567.aspx@Html.DropDownListFor( m => m.MenuSelection, (IEnumerable<SelectListItem>)ViewBag.Menu, "Select One", null ) , bao gồm cả giá trị rỗng htmlAttributesđể tránh nhầm lẫn với chữ ký nhận một biểu thức, liệt kê menu và một đối tượng (htmlAttributes).
tvanfosson

1
@tvanfosson - Cảm ơn bạn đã làm rõ. Tôi đã cố gắng sử dụng nó với kiểu Complex làm kiểu cho IEnumerable trong SelectList. Tôi đã phải chỉ định dataValueFielddataTestFieldđiều này làm cho điều này không hoạt động khi thêm giá trị optionLabel. Nó có thể hoạt động với một chút nỗ lực nhưng tôi chỉ sử dụng một trong những giải pháp thay thế. Dù sao cũng cảm ơn!
Jesse Webb

82

Tôi đã làm việc này bằng cách Điền một SelectListItem, chuyển đổi thành một Danh sách và thêm một giá trị tại chỉ mục 0.

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

Tôi khuyên bạn nên sử dụng quá tải optionLabel trong HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

17

Điều này là khả thi.

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

Tôi khuyên bạn nên sử dụng quá tải optionLabel trong HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

13

Tôi thích câu trả lời của @ AshOoO nhưng giống như @Rajan Rawal, tôi cần duy trì trạng thái mục đã chọn, nếu có. Vì vậy, tôi đã thêm tùy chỉnh của mình vào phương pháp của anh ấyAddFirstItem()

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

Tôi khuyên bạn nên sử dụng quá tải optionLabel trong 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");
        }

Điều này sẽ làm những gì bạn cần, chỉ cần gửi danh sách chọn của bạn và nó sẽ trả về một danh sách được chọn với một mục trong chỉ mục 0

Bạn có thể lưu trữ văn bản, giá trị hoặc thậm chí là chỉ mục của mục bạn cần chèn


Điều gì sẽ xảy ra nếu tôi có một số giá trị đã chọn và tôi muốn giữ lại chúng?
Rajan Rawal,

Tôi khuyên bạn nên sử dụng quá tải optionLabel trong HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

5

Đây là trình trợ giúp html cho bạn

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

Phương thức .ToList (). Insert (..) đưa một phần tử vào Danh sách của bạn. Bất kỳ vị trí nào cũng có thể được chỉ định. Sau ToList, chỉ cần thêm .Insert (0, "- - Mục đầu tiên - -")

Ma cua ban

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

Mã mới

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

2

Nghe có vẻ không thanh lịch lắm, nhưng tôi thường làm điều gì đó như sau:

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

1

Được rồi, tôi thích mã sạch nên tôi đã đặt đây là một phương thức mở rộng

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

Cách sử dụng (ví dụ):

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

Vì tùy chọn này có thể cần theo nhiều cách khác nhau, tôi đã đi đến kết luận là phát triển một đối tượng để nó có thể được sử dụng trong các tình huống khác nhau và trong các dự án tương lai

trước tiên hãy thêm lớp này vào dự án của bạn

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

Bây giờ trong Hành động điều khiển, bạn có thể làm như thế này

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

Và cuối cùng trong View bạn sẽ code như thế này.

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

0

Cách giải quyết là sử dụng câu trả lời của @ tvanfosson (câu trả lời đã chọn) và sử dụng JQuery (hoặc Javascript) để đặt giá trị của tùy chọn thành 0:

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

Hi vọng điêu nay co ich.


0

Hãy thử một cái gì đó như mã sau:

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

Tôi không biết nếu ai khác có lựa chọn tốt hơn ...

<% 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=" "})%>
<% }>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.