2011-10-04 23 views
6

Estoy creando y completando un diccionario y quiero vincularlo a la lista desplegable mediante el método de ayuda DropDownListFor.Enlace DropDownListPara ayuda a un diccionario

¿Cómo puedo asignar el diccionario key y value a la lista desplegable?

parece que yo debería ser capaz de hacer algo como:

@Html.DropDownListFor(o => o.key, o => o.value, MyDictionary); 

Parece que el primer parámetro debe ser una declaración de LINQ que los mapas de pares de claves/valor y el segundo parámetro es propio diccionario.

Respuesta

10

No puede enlazar una lista desplegable a un diccionario. No tiene sentido. Para generar una lista desplegable necesita 2 cosas: una propiedad escalar para vincular el valor seleccionado y una colección para vincular las opciones de la lista desplegable. Solo tienes la segunda de esas dos cosas, que es el diccionario. Entonces no puedes usar un ayudante fuertemente tipado.

Se podría hacer lo siguiente fealdad:

@Html.DropDownList("SelectedValue", new SelectList(MyDictionary, "Key", "Value")) 

pero por supuesto, un enfoque mucho mejor sería utilizar una vista de modelo:

public class MyViewModel 
{ 
    public string SelectedValue { get; set; } 
    public SelectList Values { get; set; } 
} 

que poblaron en su acción de controlador:

public ActionResult Foo() 
{ 
    Dictionary<string, string> dic = ... 
    var model = new MyViewModel 
    { 
     Values = new SelectList(dic, "Key", "Value") 
    }; 
    return View(model); 
} 

y finalmente en su vista fuertemente tipada:

@model MyViewModel 
@Html.DropDownListFor(x => x.SelectedValue, Model.Values) 
+1

"Se puede no unir una lista desplegable a un diccionario. No tiene sentido. "¿Podría explicar por qué? Porque podemos hacerlo fácilmente en los formularios web de ASP.NET. –

0

Me gusta su respuesta Darin. Gracias, me ayudó a pensar en esta solución. Hasta ahora solo lo he intentado con cuerdas, pero funciona bien. A continuación hay solo un ejemplo simple. También tengo métodos de extensión (no se muestran aquí) para construir objetos de Ver modelo desde objetos de modelo de esquema (para HttpGets) y para construir objetos de modelo de esquema a partir de objetos de modelo de visualización (para HttpPosts).

Ver Modelo Método

public class Step4ViewModel 
{ 
    public SelectList HowToBeContactedOptions { get; set; } 

    public string HowToBeContacted { get; set; } 
} 

extensión para hacer las cosas más fáciles y más limpio

public static class EntityExtensionMethods 
{ 
    public static Step4ViewModel PopulateDropDowns(this Step4ViewModel vm) 
    { 
     var howToBeContactedOptions = new Dictionary<string, string> 
     { 
      {"Email", "Email"}, 
      {"US Mail", "US Mail"} 
     }; 

     vm.HowToBeContactedOptions = new SelectList(howToBeContactedOptions, "Key", "Value", vm.HowToBeContacted); 
} 

controlador

[HttpPost] 
public ActionResult Step4(Step4ViewModel vm) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(vm.PopulateDropDowns()); 
    } 
} 

Ver

@Html.ValidationSummary() 
<table class="table table-bordered table-striped"> 
    <tr> 
     <td> 
      @Html.LabelFor(x => x.HowToBeContacted) 
     </td> 
     <td> 
      @Html.DropDownListFor(x => x.HowToBeContacted, Model.HowToBeContactedOptions) 
      @Html.ValidationMessageFor(x => x.HowToBeContacted) 
     </td> 
    </tr> 
</table> 
1

Usted debe tratar de esta manera:

En Controlador

ViewBag.hour = new SelectList(Hours.Values); 

void AddHours() 
{ 
    Hours = new Dictionary<int, string>(); 
    Hours.Add(00, "00"); 
    Hours.Add(01, "01"); 
    Hours.Add(02, "02"); 
} 

En Vistas

<div class="col-md-2"> 
    @Html.DropDownList("Hours", new SelectList(ViewBag.hour.Items), "Hours", htmlAttributes: new { @class = "form-control", placeholder = "Hours" }) 
</div> 
Cuestiones relacionadas