2009-02-24 49 views
6

Estoy usando ASP MVC RC1.¿Cómo puedo establecer un valor para la opción predeterminada con Html.DropDownList

Un formulario que estoy usando contiene una lista desplegable que he puesto en una vista con este código.

<%= Html.DropDownList("areaid", (SelectList)ViewData["AreaId"], "Select Area Id")%> 

Sin embargo, cuando se representa, esto es lo que me pasa

<select id="areaid" name="areaid"> 
    <option value="">Select Area Id</option> 
    <option value="1">Home</option> 
    ... 
</select> 

Lo que me gustaría es para la opción Seleccionar la zona ID tener un valor de 0 y marcarla como seleccionada por defecto, así es coherente con los otros valores y puedo validar si se ha elegido o no un área, ya que es un valor obligatorio. AreaId es un número entero, así que cuando hago clic en el formulario sin tocar la lista desplegable, MVC se queja de que "" no es un número entero y me da un error vinculante.

¿Cómo configuro un valor para la opción predeterminada y luego la selecciono en el formulario?

Gracias, Dan

Respuesta

21

yo creo que hay tres cuatro opciones. Primero, cuando esté compilando su lista SelectList o enumerable de SelectItemList, anteponga la selección con su etiqueta de opción y valor predeterminado. Ponerlo en la parte superior lo convertirá en el predeterminado si aún no se ha elegido algún otro valor en el modelo. En segundo lugar, puede crear la selección (y las opciones) "a mano" en la vista utilizando un bucle para crear las opciones. De nuevo, anteponiendo su selección predeterminada si no se incluye una en el modelo. En tercer lugar, use la extensión DropDownList, pero modifique el valor de la primera opción usando javascript después de cargar la página.

No parece ser posible utilizar la extensión DropDownList para asignar un valor a un optionLabel ya que no es modificable a utilizar string.Empty. A continuación se muestra el fragmento de código relevante de http://www.codeplex.com/aspnet.

// Make optionLabel the first item that gets rendered. 
    if (optionLabel != null) { 
     listItemBuilder.AppendLine(ListItemToOption(new SelectListItem() { Text = optionLabel, Value = String.Empty, Selected = false })); 
    } 

EDITAR: Por último, la mejor manera es tener su modelo toma un valor anulable y marcarlo como sea necesario utilizando la RequiredAttribute. Yo recomendaría usar un modelo específico de vista en lugar de un modelo de entidad para la vista. Dado que el valor es Nullable, la cadena vacía funcionará bien si se publica nuevamente sin elegir un valor. Establecerlo como un valor requerido provocará que la validación del modelo falle con un mensaje apropiado de que se requiere el valor. Esto le permitirá usar el asistente DropdownList como está.

public AreaViewModel 
{ 
    [Required] 
    public int? AreaId { get; set; } 

    public IEnumerable<SelectListItem> Areas { get; set; } 
    ... 
} 

@Html.DropDownListFor(model => model.AreaId, Model.Areas, "Select Area Id") 
+1

Gracias. Ahora creo un objeto List , inserto una opción predeterminada con el valor 0 en el índice 0 y la paso a Html.DropDownList. Funciona un regalo. – Hmobius

+0

¡Gracias también a mí! Es triste que incluso con MVC 3 no sea posible agregar el valor predeterminado:/ – LanFeusT

+0

@LanFeusT - esto fue respondido mucho antes de MVC3. Lo he actualizado para un mejor método de tratarlo desde una perspectiva modelo, esp. con MVC3. – tvanfosson

3

Para MVC3, SelectList tiene una sobrecarga por la cual puede definir el valor seleccionado.

Function Create() As ViewResult 

     ViewBag.EmployeeId = New SelectList(db.Employees, "Id", "Name", 1) 

     Return View() 

    End Function 

En este caso, me he enterado de que 1 es el identificador del elemento de la lista por defecto que quiero, pero es de suponer que podría seleccionar el valor por defecto a través de consultas o lo que flota su barco

+0

Esto funciona genial. Para responder la pregunta de Dan, creo que él quiere: –

0

en lugar de pasar el elemento predeterminado de la definición en la Vista, puede agregar los datos de "Seleccionar área" en el 0 ° índice de la Lista desde el controlador.

De esta manera los datos Seleccionar área tiene un valor de índice de 0.

0

quería usar el mismo SelectList para varios menús desplegables y no quería duplicar el SelectList en el modelo de lo que acaba de agregar un nuevo Método de extensión HTML que tomó un valor y configuró el elemento seleccionado.

public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper, string name, string value, IList<SelectListItem> selectList, object htmlAttributes) 
{ 
    IEnumerable<SelectListItem> items = selectList.Select(s => new SelectListItem {Text = s.Text, Value = s.Value, Selected = s.Value == value}); 
    return htmlHelper.DropDownList(name, items, null /* optionLabel */, htmlAttributes); 
} 
Cuestiones relacionadas