Wie kann ich ein Element zu einer SelectList in ASP.net MVC hinzufügen?

112

Grundsätzlich möchte ich ein Element am Anfang einer SelectList mit dem Standardwert 0 und dem Textwert "- Select One -" einfügen.

Etwas wie

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

Kann das gemacht werden?

GEOCHET
quelle
2
SelectListscheint wirklich nur ein Helfer zu sein, um Daten direkt an Elemente zu binden. Wenn Sie Elemente manuell hinzufügen, verwenden Sie List<SelectListItem>stattdessen.
Kai Hartmann
Könnte ich angesichts der akzeptierten Antwort und der Anzahl der Stimmen vorschlagen, dass Sie die Frage geringfügig ändern, um diese Antwort widerzuspiegeln, z. B. "Wie kann ich einer SelectList in ASP.net MVC ein Element mit leerem Wert hinzufügen"? Aber danke an @ h-dog für die Beantwortung der ursprünglichen Frage "Wie kann ich einen Artikel hinzufügen
?

Antworten:

150

Dies ist nur dann erforderlich, wenn Sie auf dem Wert 0 bestehen. Mit der Erweiterung HtmlHelper DropDownList können Sie eine Optionsbezeichnung festlegen, die als Anfangswert in der Auswahl mit einem Nullwert angezeigt wird. Verwenden Sie einfach eine der DropDownList-Signaturen mit der Optionsbezeichnung.

<%= Html.DropDownList( "DropDownValue",
                       (IEnumerable<SelectListItem>)ViewData["Menu"],
                        "-- Select One --" ) %>
Tvanfosson
quelle
1
Was ist, wenn Sie tatsächlich auf dem Wert 0 bestehen? Wenn der Wert null / eine leere Zeichenfolge ist, kann dies zu Problemen bei der Modellbindung führen.
Kjensen
2
Wenn Sie es als int zurück erwarten, dann würde ich int verwenden? und lassen Sie es trotzdem null, wenn keine Auswahl getroffen wurde.
Tvanfosson
13
Das Problem bei dieser Lösung ist, dass Sie Ihren ausgewählten Artikel verlieren.
37Stars
1
@JesseWebb Ich vermute , dass Sie nur sicherstellen, müssen Sie eine Signatur verwenden , das die Option Etikett enthält, msdn.microsoft.com/en-us/library/ee703567.aspx , @Html.DropDownListFor( m => m.MenuSelection, (IEnumerable<SelectListItem>)ViewBag.Menu, "Select One", null )zum Beispiel, einschließlich der Null htmlAttributeszu vermeiden , um Verwechslungen mit der Unterschrift Dazu gehören ein Ausdruck, die Menüaufzählung und ein Objekt (htmlAttributes).
Tvanfosson
1
@tvanfosson - Vielen Dank für die Klarstellung. Ich habe versucht, es mit einem komplexen Typ als Typ für die IEnumerable in der SelectList zu verwenden. Ich musste das dataValueFieldund das angeben, dataTestFieldwas dazu führte, dass dies beim Hinzufügen eines optionLabel-Werts nicht funktionierte. Es hätte wahrscheinlich mit etwas mehr Aufwand funktionieren können, aber ich habe nur eine der alternativen Lösungen verwendet. Trotzdem danke!
Jesse Webb
82

Ich habe dies zum Laufen gebracht, indem ich ein SelectListItem aufgefüllt, in eine Liste konvertiert und einen Wert bei Index 0 hinzugefügt habe.

List<SelectListItem> items = new SelectList(CurrentViewSetups, "SetupId", "SetupName", setupid).ToList(); 
items.Insert(0, (new SelectListItem { Text = "[None]", Value = "0" }));
ViewData["SetupsSelectList"] = items;
davewilliams459
quelle
Ich empfehle die Verwendung der OptionLabel-Überladung im HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5
17

Das ist möglich.

//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
quelle
Ich empfehle die Verwendung der OptionLabel-Überladung im HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5
13

Ich mochte die Antwort von @ AshOoO, aber wie @Rajan Rawal musste ich den ausgewählten Artikelstatus beibehalten, falls vorhanden. Also habe ich seine Anpassung zu seiner Methode hinzugefügtAddFirstItem()

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 Hund
quelle
Ich empfehle die Verwendung der OptionLabel-Überladung im 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");
        }

Dies sollte tun, was Sie brauchen, senden Sie einfach Ihre Auswahlliste und es wird eine Auswahlliste mit einem Element in Index 0 zurückgegeben

Sie können den Text, den Wert oder sogar den Index des Elements, das Sie einfügen möchten, anpassen

AshOoO
quelle
Was ist, wenn ich einige ausgewählte Werte habe und diese beibehalten möchte?
Rajan Rawal
Ich empfehle die Verwendung der OptionLabel-Überladung im HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5
5

Hier HTML-Helfer für Sie

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;
}
versteckt
quelle
3

Die Methode .ToList (). Insert (..) fügt ein Element in Ihre Liste ein. Jede Position kann angegeben werden. Nach ToList fügen Sie einfach .Insert (0, "- - First Item - -") hinzu.

Dein Code

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

Neuer Code

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

Klingt vielleicht nicht sehr elegant, aber normalerweise mache ich so etwas:

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

Okay, ich mag sauberen Code, also habe ich dies zu einer Erweiterungsmethode gemacht

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

Verwendung (am Beispiel):

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
quelle
1

Da diese Option auf viele verschiedene Arten erforderlich sein kann, bin ich zu dem Schluss gekommen, ein Objekt so zu entwickeln, dass es in verschiedenen Szenarien und in zukünftigen Projekten verwendet werden kann

Fügen Sie diese Klasse zuerst Ihrem Projekt hinzu

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

In Controller Action können Sie dies jetzt tun

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

Und schließlich werden Sie in View so codieren.

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

Eine Problemumgehung besteht darin, die Antwort von @ tvanfosson (die ausgewählte Antwort) zu verwenden und mit JQuery (oder Javascript) den Wert der Option auf 0 zu setzen:

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

Hoffe das hilft.

logischer Kerl
quelle
0

Versuchen Sie so etwas wie den folgenden Code:

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
quelle
-5

Ich nicht, wenn jemand anderes eine bessere Option hat ...

<% 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=" "})%>
<% }>
Neu2this
quelle