2011-10-04 10 views
6

Sto creando e popolando un dizionario e desidero associarlo a un elenco a discesa utilizzando il metodo di supporto DropDownListFor.Associazione DropDownListPer helper a un dizionario

Come posso mappare quel key dizionario e value a dropdown?

sembra che dovrei essere in grado di fare qualcosa di simile:

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

Sembra che il primo parametro dovrebbe essere una dichiarazione LINQ che mappa coppia chiave/valore e secondo parametro è dizionario stesso.

risposta

10

Non è possibile associare un elenco a discesa a un dizionario. Non ha senso. Per generare un elenco a discesa sono necessari 2 elementi: una proprietà scalare per associare il valore selezionato a e una raccolta per associare le opzioni dell'elenco a discesa. Hai solo la seconda di quelle due cose che è il dizionario. Quindi non puoi usare un helper fortemente tipizzato.

Si potrebbe fare la seguente bruttezza:

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

ma naturalmente un approccio di gran lunga migliore sarebbe quella di utilizzare un modello di vista:

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

che si popolano nella vostra azione di controllo:

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

e infine nella visualizzazione fortemente digitata:

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

"Si può non associare un elenco a discesa a un dizionario. Non ha senso. "Potresti spiegare perché, perché possiamo farlo facilmente in Web Form ASP.NET. –

0

Mi piace la risposta Darin. Grazie, mi ha aiutato a trovare questa soluzione. Finora l'ho provato solo con le stringhe, ma funziona bene. Di seguito è solo un semplice esempio. Dispongo anche di metodi di estensione (non mostrati qui) per la creazione di oggetti Modello vista da oggetti Modello schema (per HttpGets) e per la creazione di oggetti Modello schema da oggetti Modello vista (per HttpPosts).

View Modello Metodo

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

    public string HowToBeContacted { get; set; } 
} 

estensione per rendere le cose più facili e più pulito

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

controller

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

View

@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

Si dovrebbe provare in questo modo:

controller

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

In Visualizzazioni

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