Come posso aggiungere un elemento a un SelectList in ASP.net MVC


112

Fondamentalmente sto cercando di inserire un elemento all'inizio di un SelectList con il valore predefinito di 0 e il valore del testo di "- Seleziona uno -"

Qualcosa di simile a

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

Può essere fatto?


2
SelectListsembra davvero essere solo un aiuto per associare i dati direttamente agli elementi. Se aggiungi elementi manualmente, utilizza List<SelectListItem>invece.
Kai Hartmann

Data la risposta accettata e il numero di voti, potrei suggerire di modificare leggermente la domanda per riflettere quella risposta i, e, "Come posso aggiungere un elemento con valore vuoto a un SelectList in ASP.net MVC"? Ma merito e grazie a @ h-dog per aver risposto alla domanda originale "Come posso aggiungere un articolo" di per sé
AndrewD

Risposte:


150

Non è davvero necessario farlo a meno che non si insista sul valore 0. L'estensione HtmlHelper DropDownList consente di impostare un'etichetta di opzione che viene visualizzata come valore iniziale nella selezione con un valore nullo. Usa semplicemente una delle firme DropDownList che ha l'etichetta dell'opzione.

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

1
E se insisti effettivamente sul valore 0? Se il valore è null / una stringa vuota, può causare problemi con l'associazione del modello.
Kjensen

2
Se te lo aspetti indietro come int, allora dovrei usare int? e lasciarlo comunque nullo se non è stata effettuata alcuna selezione.
tvanfosson

13
Il problema con questa soluzione è che perdi l'oggetto selezionato.
37Stars

1
@JesseWebb Sospetto che tu debba solo assicurarti di utilizzare una firma che includa l'etichetta dell'opzione, msdn.microsoft.com/en-us/library/ee703567.aspx , @Html.DropDownListFor( m => m.MenuSelection, (IEnumerable<SelectListItem>)ViewBag.Menu, "Select One", null )ad esempio, incluso il null htmlAttributesper evitare confusione con la firma che accetta un'espressione, l'enumerazione del menu e un oggetto (htmlAttributes).
tvanfosson

1
@tvanfosson - Grazie per aver chiarito. Ho provato a usarlo con un tipo Complex come tipo per IEnumerable in SelectList. Ho dovuto specificare il dataValueFielde il dataTestFieldche ha reso questo non funzionante quando si aggiunge un valore optionLabel. Probabilmente avrebbe potuto funzionare con un po 'più di sforzo, ma ho solo usato una delle soluzioni alternative. Grazie comunque!
Jesse Webb

82

Ho ottenuto che funzioni popolando un SelectListItem, convertendolo in un elenco e aggiungendo un valore all'indice 0.

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

Consiglio di utilizzare il sovraccarico optionLabel in HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

17

Questo è possibile.

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

Consiglio di utilizzare il sovraccarico optionLabel in HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

13

Mi è piaciuta la risposta di @ AshOoO ma come @Rajan Rawal avevo bisogno di preservare lo stato dell'oggetto selezionato, se presente. Quindi ho aggiunto la mia personalizzazione al suo metodoAddFirstItem()

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

Consiglio di utilizzare il sovraccarico optionLabel in 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");
        }

Questo dovrebbe fare quello che ti serve, invia semplicemente il tuo elenco di selezione e restituirà un elenco di selezione con un elemento nell'indice 0

Puoi personalizzare il testo, il valore o anche l'indice dell'articolo che devi inserire


cosa succede se ho alcuni valori selezionati e voglio conservarli?
Rajan Rawal

Consiglio di utilizzare il sovraccarico optionLabel in HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

5

Qui html helper per te

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

Il metodo .ToList (). Insert (..) inserisce un elemento nella tua lista. È possibile specificare qualsiasi posizione. Dopo ToList, aggiungi .Insert (0, "- - First Item - -")

Il tuo codice

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

Nuovo codice

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

2

Potrebbe non sembrare molto elegante, ma di solito faccio qualcosa del genere:

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

1

Ok, mi piace il codice pulito, quindi ho reso questo un metodo di estensione

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

Utilizzo (per esempio):

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

Poiché questa opzione può richiedere in molti modi diversi, sono giunto alla conclusione di sviluppare un oggetto in modo che possa essere utilizzato in diversi scenari e in progetti futuri

prima aggiungi questa classe al tuo progetto

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

Ora in Controller Action puoi fare così

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

E infine in View codificherai in questo modo.

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

0

Una soluzione consiste nell'utilizzare la risposta di @ tvanfosson (la risposta selezionata) e utilizzare JQuery (o Javascript) per impostare il valore dell'opzione su 0:

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

Spero che questo ti aiuti.


0

Prova qualcosa di simile al codice seguente:

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

Non lo so se qualcun altro ha un'opzione migliore ...

<% 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=" "})%>
<% }>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.