Как добавить элемент в список SelectList в ASP.net MVC

В основном я хочу вставить элемент в начало SelectList со значением по умолчанию 0 и текстовым значением «- Select One -»

Что-то типа

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

Можно ли это сделать?


person Community    schedule 21.03.2009    source источник
comment
SelectList действительно кажется просто помощником для привязки данных непосредственно к элементам. Если вы добавляете элементы вручную, используйте вместо этого List<SelectListItem>.   -  person Kai Hartmann    schedule 26.10.2018
comment
Учитывая принятый ответ и количество голосов, могу ли я предложить вам немного изменить вопрос, чтобы отразить этот ответ i, e, как мне добавить элемент с пустым значением в SelectList в ASP.net MVC? Но спасибо и спасибо @ h-dog за ответ на исходный вопрос. Как я могу добавить вопрос как таковой?   -  person AndrewD    schedule 08.11.2018


Ответы (13)


На самом деле нет необходимости делать это, если вы не настаиваете на значении 0. Расширение HtmlHelper DropDownList позволяет вам установить метку параметра, которая отображается как начальное значение в выборе с нулевым значением. Просто используйте одну из подписей DropDownList с меткой параметра.

<%= Html.DropDownList( "DropDownValue",
                       (IEnumerable<SelectListItem>)ViewData["Menu"],
                        "-- Select One --" ) %>
person tvanfosson    schedule 21.03.2009
comment
Что, если вы действительно настаиваете на значении 0? Если значение равно нулю / пустой строке, это может вызвать проблемы с привязкой модели. - person Kjensen; 12.11.2009
comment
Если вы ожидаете, что он вернется как int, я бы использовал int? и оставьте его пустым, если выбор не был сделан. - person tvanfosson; 12.11.2009
comment
Проблема с этим решением заключается в том, что вы теряете выбранный вами предмет. - person 37Stars; 18.12.2009
comment
Я поместил пример помощника html ниже - person hidden; 29.11.2011
comment
Это не работает при использовании DropDownListFor, мне пришлось использовать одно из следующих решений. - person Jesse Webb; 17.07.2012
comment
@JesseWebb Я подозреваю, вам просто нужно убедиться, что вы используете подпись, которая включает метку параметра, msdn.microsoft.com/en-us/library/ee703567.aspx, @Html.DropDownListFor( m => m.MenuSelection, (IEnumerable<SelectListItem>)ViewBag.Menu, "Select One", null ), например, включая null htmlAttributes, чтобы избежать путаницы с подписью, которая принимает выражение, перечисление меню и объект (htmlAttributes). - person tvanfosson; 17.07.2012
comment
@tvanfosson - Спасибо за разъяснения. Я попытался использовать его с типом Complex в качестве типа для IEnumerable в списке SelectList. Мне пришлось указать dataValueField и dataTestField, из-за которых это не работало при добавлении значения optionLabel. Возможно, это сработало бы, приложив немного больше усилий, но я просто использовал одно из альтернативных решений. В любом случае спасибо! - person Jesse Webb; 17.07.2012
comment
Кроме того, значение необходимо, если вы используете jquery.unobtrusive.js. - person CAOakley; 09.06.2014
comment
Судя по всему, я не могу редактировать свой предыдущий пост. Чтобы быть более конкретным, это когда DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes имеет значение true. Так что, возможно, есть экземпляр, где вам не нужно поле, поэтому вы передаете значение 0 для элемента - Select -. - person CAOakley; 09.06.2014
comment
Uncaught ReferenceError: HTML не определен - person Mehman Bashirov; 19.09.2014
comment
@MehmanBashirov это работает только с MVC. Если свойство Html не определено на ViewPage в MVC, у вас есть более серьезные проблемы, чем при попытке добавить элемент в список выбора. msdn.microsoft .com / ru-ru / library / - person tvanfosson; 19.09.2014
comment
Я настаиваю на 0, поэтому могу использовать привязку. Передача нуля или отсутствия значения - беспорядок. - person Unw0und; 19.06.2015
comment
То же самое работает для DropDownListFor: @ Html.DropDownListFor (x = ›x.id, new SelectList (Model.LstItems, value, text),‹ NONE ›, new {@class = form-control}) - person Jcis; 07.11.2019

Я заставил это работать, заполнив SelectListItem, преобразовав в список и добавив значение с индексом 0.

List<SelectListItem> items = new SelectList(CurrentViewSetups, "SetupId", "SetupName", setupid).ToList(); 
items.Insert(0, (new SelectListItem { Text = "[None]", Value = "0" }));
ViewData["SetupsSelectList"] = items;
person davewilliams459    schedule 29.04.2010
comment
Я рекомендую использовать перегрузку optionLabel в HtmlHelper - ›@ Html.DropDownListFor - person 2b77bee6-5445-4c77-b1eb-4df3e5; 12.11.2019

Это возможно.

//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);
person eaf    schedule 05.06.2013
comment
Я рекомендую использовать перегрузку optionLabel в HtmlHelper - ›@ Html.DropDownListFor - person 2b77bee6-5445-4c77-b1eb-4df3e5; 12.11.2019
comment
Если вы начинаете с SelectList, в котором уже есть элементы, как в случае OP, следующая строка также необходима для сохранения этих элементов: newList.AddRange(myOriginalSelectList). - person Tawab Wakil; 27.05.2021

Мне понравился ответ @ 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);
}
person H Dog    schedule 01.06.2015
comment
Я рекомендую использовать перегрузку optionLabel в HtmlHelper - ›@ Html.DropDownListFor - person 2b77bee6-5445-4c77-b1eb-4df3e5; 12.11.2019

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.

Вы можете настроить текст, значение или даже индекс элемента, который вам нужно вставить.

person AshOoO    schedule 06.02.2012
comment
что, если у меня есть некоторые выбранные значения, и я хочу их сохранить? - person Rajan Rawal; 26.07.2012
comment
Я рекомендую использовать перегрузку optionLabel в HtmlHelper - ›@ Html.DropDownListFor - person 2b77bee6-5445-4c77-b1eb-4df3e5; 12.11.2019

Здесь 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;
}
person hidden    schedule 29.11.2011

Метод .ToList (). Insert (..) помещает элемент в ваш список. Можно указать любую позицию. После ToList просто добавьте .Insert (0, - - Первый элемент - -)

Ваш код

SelectList list = new SelectList(repository.func.ToList());

Новый код

SelectList list = new SelectList(repository.func.ToList().Insert(0, "- - First Item - -"));
person Moji    schedule 03.11.2015
comment
SelectList.Items не имеет метода Add (). - person mxmissile; 22.01.2021

Может показаться не очень элегантным, но я обычно делаю что-то вроде этого:

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

Хорошо, мне нравится чистый код, поэтому я сделал это методом расширения

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");
person Jeff    schedule 21.08.2012

Поскольку этот вариант может потребоваться по-разному, я пришел к выводу, что нужно разработать объект, чтобы его можно было использовать в различных сценариях и в будущих проектах.

сначала добавьте этот класс в свой проект

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();" })
person sairfan    schedule 15.01.2015

Обходной путь - использовать ответ @ tvanfosson (выбранный ответ) и использовать JQuery (или Javascript), чтобы установить значение параметра равным 0:

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

Надеюсь это поможет.

person logicalguy    schedule 29.07.2016

Попробуйте что-то вроде следующего кода:

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");
person Enrique Mingyar Torrez Hinojos    schedule 18.04.2019

Я не знаю, есть ли у кого-нибудь лучший вариант ...

<% 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=" "})%>
<% }>
person New2this    schedule 19.01.2010