2011-08-29 29 views

Respuesta

74

Por lo tanto, hice algo como esto:

@Html.DropDownListFor(model => model.Dessert, 
         new SelectList(Model.AvailableDesserts, "DessertID", "DessertName"), 
         "---Select A Dessert ---") 

parece funcionar bastante bien. Dessert en mi modelo de vista es el seleccionado por el usuario. AvailableDesserts es una colección de unos para elegir. Espero que ayude.

+2

Esto agrega un "--Seleccione--" en la parte superior del menú desplegable, pero se establece de manera predeterminada en el siguiente elemento del menú desplegable, al menos en mi ejemplo: @ Html.DropDownListFor ( x => x.SelectedTeamID, new SelectList (Model.Teams, "TeamID", "TeamName"), "- Seleccione -") – user517406

+4

¿Cuál es el valor predeterminado del SelectedTeamID que está enviando a la Vista? En mi 'Create.cshtml' se usará de forma predeterminada la opción" --- Seleccionar un postre --- "(el ID es un entero y por defecto es 0) mientras que en mi' Edit.cshtml' se usará de manera predeterminada lo que sea el valor actual es para 'model.Dessert' en mi viewmodel. Esto puede ser el resultado de mis DessertIds comenzando en 1 (la clave principal en mi tabla de postres comienza en 1). Solo una conjetura, realmente. Creo que es por eso que está sucediendo. – itsmatt

+0

Creo que lo que hace es mirar el valor actual del campo modelo y luego seleccionarlo de manera predeterminada. Por ejemplo, si cuando construyó su modelo de vista (por ejemplo, para Crear llamada) y establece explícitamente el ID de equipo seleccionado en 6 y lo pasó a la Vista, mostraría el nombre de equipo asociado con TeamID 6, suponiendo que existiera uno. – itsmatt

14

que tienen un métodos de extensión de los pares en SelectList

public static SelectList PreAppend(this SelectList list, string dataTextField, string selectedValue, bool selected=false) 
    { 
     var items = new List<SelectListItem>(); 
     items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue }); 
     items.AddRange(list.Items.Cast<SelectListItem>().ToList()); 
     return new SelectList(items, "Value", "Text"); 
    } 
    public static SelectList Append(this SelectList list, string dataTextField, string selectedValue, bool selected=false) 
    { 
     var items = list.Items.Cast<SelectListItem>().ToList(); 
     items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue }); 
     return new SelectList(items, "Value", "Text"); 
    } 
    public static SelectList Default(this SelectList list,string DataTextField,string SelectedValue) 
    { 
     return list.PreAppend(DataTextField, SelectedValue, true); 
    } 

Entonces mi maquinilla de afeitar que parece:

@Html.DropDownListFor(m=>m.SelectedState, 
    Model.StateList().Default("Select One","")) 
+0

Soy nuevo en MVC, ¿puede por favor? dime cómo agregaría métodos de extensión a mi lista de selección – user517406

+3

Agregue una clase estática a su proyecto y agregue estos métodos a ella. Asegúrese de que la página a la que intenta llamar importará el espacio de nombres si no es el espacio de nombres del proyecto global. La sintaxis en la máquina de afeitar es '@usando Myproject.Extensions' o lo que sea que nombre su clase. Para obtener más información, lea: http://msdn.microsoft.com/en-us/library/bb383977.aspx – asawyer

+0

Preferiría la ruta de Ayuda/Extensión tal como lo propone, pero tengo problemas para implementarla. Aparece el siguiente error: 'No se puede convertir el objeto de tipo 'MyApp.UI.Models.Address' para escribir 'System.Web.Mvc.SelectListItem'.' El código que uso es:' @ Html.DropDownListFor (m => m.EmailAddressID, nueva SelectList (Model.Addresses, "AddressID", "EmailAddress"). PreAppend ("--- Seleccione una dirección ---", "")) 'Se compila bien y se reconoce en la Vista, pero presenta el error anterior en tiempo de ejecución. El método de hardcoded presentado por @itsmatt funciona. ¿Alguna idea sobre la modificación que pueda necesitar para los métodos de extensión? – atconway

3

Hola ¿qué hay de tratar esto (en caso de que utilice el método DisplayFor)

private IEnumerable<SelectListItem> AddDefaultOption(IEnumerable<SelectListItem> list, string dataTextField, string selectedValue) 
    { 
     var items = new List<SelectListItem>(); 
     items.Add(new SelectListItem() { Text = dataTextField, Value = selectedValue}); 
     items.AddRange(list); 
     return items; 
    } 

A continuación, simplemente agregue este código a su Controlador

//lambda expression binding 
ViewBag.YourList = db.YourTable.Select(x => x).ToList().Select(x => new SelectListItem 
     { 
      Value = x.Id.ToString(), 
      Text = x.DisplayName.ToString() 
     }); 

     ViewBag.YourList = AddDefaultOption(ViewBag.YourList, "Select One...", "null", true); 

Y, finalmente, a la vista que podría mostrar una lista desplegable, cuadro combinado al igual que este

<div class="editor-label"> 
     Your Label 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.ForeignKey, (IEnumerable<SelectListItem>)ViewBag.YourList) 
    </div> 
+0

Es extraño que estés haciendo el '.Select (x => x) .ToList()' antes del ' .Seleccione (x => new SelectListItem' Eso no es necesario. –

0

quería establecer el valor predeterminado a todo lo que se pasa como un parámetro de URL llamado SiteType:

<div class="form-group"> 
     @Html.LabelFor(model => model.Type, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(model => model.Type, ChangeOrderSite.SiteTypeNames.Select(s => new SelectListItem { Text = s.Value, Value = s.Key.ToString(), Selected = s.Key.ToString() == Request["SiteType"] }), new { @class = "control-label col-md-2" }) 
      @Html.ValidationMessageFor(model => model.Type) 
     </div> 
    </div> 

Mi menú desplegable es una lista de tipos de sitios.

Cuestiones relacionadas