69 votes

ASP.NET MVC Liaison à un dictionnaire

J'essaie de lier des valeurs de dictionnaire dans MVC. Dans l'action, j'ai ...

 model.Params = new Dictionary<string, string>();

model.Params.Add("Value1", "1");
model.Params.Add("Value2", "2");
model.Params.Add("Value3", "3");
 

et dans la vue que j'ai ...

 @foreach (KeyValuePair<string, string> kvp in Model.Params)
{ 
<tr>
  <td>
    <input type="hidden" name="Params.Key" value="@kvp.Key" />
    @Html.TextBox("Params[" + kvp.Key + "]")
  </td>
</tr>
}
 

Mais la vue n'affiche pas les valeurs initiales, et lorsque le formulaire est soumis, la propriété 'Params' est nulle?

Quelqu'un peut-il me dire où je me trompe?

Merci.

92voto

Ant P Points 12459

Dans ASP.NET MVC 4, le classeur de modèle par défaut lie les dictionnaires à l'aide de la syntaxe d'indexeur de dictionnaire typique property[key] .

Si vous avez un Dictionary<string, string> dans votre modèle, vous pouvez désormais le lier directement avec le balisage suivant:

 <input type="hidden" name="MyDictionary[MyKey]" value="MyValue" />
 

Par exemple, si vous souhaitez utiliser un ensemble de cases à cocher pour sélectionner un sous-ensemble des éléments d'un dictionnaire et vous lier à la même propriété, vous pouvez effectuer les opérations suivantes:

 @foreach(var kvp in Model.MyDictionary)
{
    <input type="checkbox" name="@("MyDictionary[" + kvp.Key + "]")"
        value="@kvp.Value" />
}
 

60voto

Jokin Points 1809

vous devriez jeter un oeil à ce post de scott, hanselman: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

Le classeur par défaut il suffit de comprendre les dictionnaires dans le format:

params[0].key = kvp.key
params[0].value = kvp.value

L'indice des param doit être séquentielle, à partir de 0 et sans lacunes. L'actuel aides ne prennent pas en charge ce, de sorte que vous devez créer les champs du formulaire par vous-même.

bien sûr, vous pouvez mettre en œuvre votre propre matériel, comme celui-ci: http://siphon9.net/loune/2009/12/a-intuitive-dictionary-model-binder-for-asp-net-mvc/

23voto

Sphinxxx Points 2257

En s'appuyant sur la réponse de @ AntP, il existe un moyen encore moins verbeux, laissant MVC faire plus de travail (au moins avec TextBoxFor() sur un Dictionary<string, string> - Je n'ai pas essayé CheckBoxFor() sur un Dictionary<xxx, bool> ):

 @foreach(var kvp in Model.MyDictionary)
{
    @Html.Label(kvp.Key);
    @Html.TextBoxFor(m => m.MyDictionary[kvp.Key]);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X