Как я могу добавить элемент в список выбора в ASP.net MVC

В основном я хочу вставить элемент в начало списка SelectList со значением по умолчанию 0 и значением текста "- Выбрать один -"

Что-то вроде

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

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

104 голоса | спросил Barrigon 21 MaramSat, 21 Mar 2009 05:07:17 +03002009-03-21T05:07:17+03:0005 2009, 05:07:17

10 ответов


0

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

<%= Html.DropDownList( "DropDownValue",
                       (IEnumerable<SelectListItem>)ViewData["Menu"],
                        "-- Select One --" ) %>
ответил tvanfosson 21 MaramSat, 21 Mar 2009 05:16:28 +03002009-03-21T05:16:28+03:0005 2009, 05:16:28
0

Я получил это для работы, заполнив SelectListItem, преобразовав в List и добавив значение по индексу 0.

List<SelectListItem> items = new SelectList(CurrentViewSetups, "SetupId", "SetupName", setupid).ToList(); 
items.Insert(0, (new SelectListItem { Text = "[None]", Value = "0" }));
ViewData["SetupsSelectList"] = items;
ответил davewilliams459 29 AMpThu, 29 Apr 2010 04:23:45 +040023Thursday 2010, 04:23:45
0

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

//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 5 J0000006Europe/Moscow 2013, 19:20:36
0

Мне понравился ответ @ 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);
}
ответил H Dog 1 J0000006Europe/Moscow 2015, 23:31:35
0

Метод .ToList (). Insert (..) помещает элемент в ваш список. Любая позиция может быть указана. После ToList просто добавьте .Insert (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);
ответил Moji 3 22015vEurope/Moscow11bEurope/MoscowTue, 03 Nov 2015 20:04:53 +0300 2015, 20:04:53
0

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

    var items = repository.func.ToList();
    items.Insert(0, new funcItem { ID = 0, TextValue = "[None]" });
    ViewBag.MyData = new SelectList(items);
ответил Androiderson 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 03 Sep 2012 08:00:36 +0400 2012, 08:00:36
0

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

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");
ответил Jeff 22 AM00000030000000631 2012, 03:37:06
0

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

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

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();" })
ответил sairfan 16 Jam1000000amFri, 16 Jan 2015 00:39:48 +030015 2015, 00:39:48
0

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

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

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

ответил logicalguy 29 J000000Friday16 2016, 08:20:19
0

Нет, если у кого-то еще есть лучший вариант ...

<% 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=" "})%>
<% }>
ответил New2this 19 Jpm1000000pmTue, 19 Jan 2010 22:10:21 +030010 2010, 22:10:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132