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?
vous devriez jeter un œil à cet article de scott hanselman: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx
Le classeur par défaut comprend simplement les dictionnaires au format:
params[0].key = kvp.key
params[0].value = kvp.value
L'index du paramètre doit être séquentiel, à partir de 0 et sans aucun espace. Les assistants actuels ne prennent pas en charge cela, vous devez donc créer vous-même les champs de saisie du formulaire.
vous pouvez bien sûr implémenter votre propre classeur, comme celui-ci: http://siphon9.net/loune/2009/12/a-intuitive-dictionary-model-binder-for-asp-net-mvc/
Dans ASP.NET MVC 4, le classeur de modèle par défaut liera les dictionnaires à l'aide de la syntaxe d'indexeur de dictionnaire typique property[key]
.
Si tu as un Dictionary<string, string>
dans votre modèle, vous pouvez désormais vous y connecter 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" />
}
En s'appuyant sur la réponse de @ AntP, il existe un moyen encore moins détaillé, permettant à MVC de 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]);
}