¿Cómo puedo agregar un elemento a una lista de selección en ASP.net MVC?

Básicamente, estoy buscando insertar un elemento al principio de una lista de selección con el valor predeterminado de 0 y el valor de texto de “- Seleccionar uno -”

Algo como

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

Se puede hacer esto?

Realmente no es necesario hacer esto a menos que insista en el valor de 0. La extensión HtmlHelper DropDownList le permite establecer una etiqueta de opción que se muestra como el valor inicial en la selección con un valor nulo. Simplemente use una de las firmas DropDownList que tiene la etiqueta de opción.

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

Lo hice funcionar rellenando un SelectListItem, convirtiéndolo en una lista y agregando un valor en el índice 0.

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

Esto es posible.

 //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 newList = new List(); //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); 

Me gustó la respuesta de @ AshOoO, pero al igual que @Rajan Rawal, necesitaba preservar el estado del elemento seleccionado, si lo hubiera. Así que agregué mi personalización a su método AddFirstItem()

 public static SelectList AddFirstItem(SelectList origList, SelectListItem firstItem) { List 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); } 
 private SelectList AddFirstItem(SelectList list) { List _list = list.ToList(); _list.Insert(0, new SelectListItem() { Value = "-1", Text = "This Is First Item" }); return new SelectList((IEnumerable)_list, "Value", "Text"); } 

Esto debería hacer lo que necesita, solo envíe su lista de selección y le devolverá una lista de selección con un elemento en el índice 0

Puede enviar el texto, el valor o incluso el índice del artículo que necesita insertar

El método .ToList (). Insert (…) pone un elemento en su lista. Cualquier posición puede ser especificada. Después de ToList simplemente agregue .Insert (0, “- – First Item – -“)

Tu codigo

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

Nuevo código

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

Puede que no suene muy elegante, pero generalmente hago algo como esto:

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

Aquí html helper para usted

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

De acuerdo, me gusta el código limpio, así que hice este un método de extensión

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

Uso (por ejemplo):

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

Como esta opción puede necesitar de muchas maneras diferentes, llegué a la conclusión de desarrollar un objeto para que pueda ser utilizado en diferentes escenarios y en proyectos futuros.

primero agrega esta clase a tu proyecto

 public class SelectListDefaults { private IList getDefaultItems = new List(); public SelectListDefaults() { this.AddDefaultItem("(All)", "-1"); } public SelectListDefaults(string text, string value) { this.AddDefaultItem(text, value); } public IList GetDefaultItems { get { return getDefaultItems; } } public void AddDefaultItem(string text, string value) { getDefaultItems.Add(new SelectListItem() { Text = text, Value = value }); } } 

Ahora en Controller Action puedes hacer esto

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

Y finalmente en View codificarás así.

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

Una solución alternativa es usar la respuesta de @tvanfosson (la respuesta seleccionada) y usar JQuery (o Javascript) para establecer el valor de la opción en 0:

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

Espero que esto ayude.

No lo hago si alguien más tiene una mejor opció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=" "})%> <% }>