2010-03-07 42 views
12

Estoy tratando de comprender la mejor manera de implementar un DropDownList en ASP.NET MVC 2 utilizando el ayudante DropDownListFor. Esta es una pregunta de varias partes.¿La mejor manera de implementar DropDownList en ASP.NET MVC 2?

En primer lugar, ¿cuál es la mejor manera de pasar los datos de la lista a la vista?

  1. pasa una lista en su modelo con una propiedad SelectList que contiene los datos
  2. pasa una lista en la vía ViewData

¿Cómo puedo obtener un valor en blanco en el DropDownList? ¿Debo compilarlo en el SelectList cuando lo estoy creando o hay algún otro medio para decirle al ayudante que cree automáticamente un valor vacío?

Por último, si por alguna razón hay un error en el servidor y tengo que volver a mostrar la pantalla con el DropDownList, ¿debo volver a buscar los valores de la lista para pasar al modelo de vista? Estos datos no se mantienen entre las publicaciones (al menos no cuando lo paso a través de mi modelo de vista), así que iba a buscarlo de nuevo (está en la memoria caché). ¿Estoy haciendo esto correctamente?

Respuesta

9

Su mejor opción es crear un SelectList en su Controlador - usar mi método de extensión aquí: http://blog.wekeroad.com/2010/01/20/my-favorite-helpers-for-aspnet-mvc

pop que en ViewData utilizando la misma clave que el nombre de la propiedad: ViewData["statusid"]=MySelectList

Entonces sólo tiene que utilizar Html.DropDownFor(x=>x.StatusID) y ya está todo listo.

+1

El problema con el uso de ViewData es que hace que su controlador sea mucho más difícil de probar. Si mantiene todo en ViewModel, sus pruebas son mucho mejores. – Mac

+2

En realidad, no es para nada diferente: con ViewModel tienes que spelunk ViewData.Model, de lo contrario, solo tienes que pedirlo con una clave. No hay diferencia en absoluto ... –

+0

http://stackoverflow.com/a/5177332/986862 –

0

(Usted sabe que esto ya!)

  1. pasa una lista en su modelo con una propiedad SelectList que contiene los datos

Sí, se añadirán cuando se genera la SelectList. (Si construyes la lista usando LINQ, Union puede ser útil.)

Sí, hazlo, y sí lo eres.

3

Respondiendo en partes:

  1. La mejor manera en mi humilde opinión es pasar la lista en el ViewModel así:

    public SelectList Colors 
    { 
        get 
        { 
         // Getting a list of Colors from the database for example... 
         List<Color> colors = GetColors().ToList(); 
    
         // Returning a SelectList to be used on the View side 
         return new SelectList(colors, "Value", "Name"); 
        } 
    } 
    
  2. Para obtener una opción por defecto en blanco o como (- Selección un color -), puede hacer esto en el lado de la vista:

    @Html.DropDownListFor(m => m.Color, Model.Colors, "-- Pick a color --") 
    
  3. Tendrá que buscar/completar la lista nuevamente si es parte de ViewModel.


Tome un vistazo a la siguiente entrada en el blog.Se le puede dar algunos consejos:

Drop-down Lists and ASP.NET MVC

2

Se podría hacer algo como:

<%= Html.DropDownListFor((x => x.ListItems), Model.ListItems, "")%> 

o

<%= Html.DropDownList("ListItems", Model.ListItems, "")%> 

El último parámetro 'optionLabel' hace que un elemento de lista en blanco

En este caso, puede ver ListItems es una propiedad del modelo.

He hecho la vista fuertemente tipada al modelo también.

0

Me resulta más intuitivo trabajar con una secuencia de SelectListItems (en lugar de una SelectList).

Por ejemplo, esto crearía un IEnumerable<SelectListItem> a partir de una secuencia de objetos del cliente que puede pasar al helper Html.DropDownListFor (...). La propiedad 'Seleccionado' configurará opcionalmente el elemento predeterminado en la lista desplegable.

var customers = ... // Get Customers 
var items = customers.Select(c => new SelectListItem 
          { 
           Selected = (c.Id == selectedCustomerId), 
           Text = c.Email, 
           Value = c.Id.ToString() 
          }); 
Cuestiones relacionadas