ASP.NET привязка MVC к словарю
Я пытаюсь связать значения словаря в MVC.
в рамках действия у меня есть:
model.Params = new Dictionary<string, string>();
model.Params.Add("Value1", "1");
model.Params.Add("Value2", "2");
model.Params.Add("Value3", "3");
и в пределах зрения у меня есть:
@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>
}
но представление не отображает начальные значения, и когда форма отправляется Params
свойство равно null?
3 ответа:
вы должны взглянуть на этот пост от Скотта Хансельмана: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx
связыватель по умолчанию просто понимает словари в формате:
params[0].key = kvp.key params[0].value = kvp.value
индекс param должен быть последовательным, начиная с 0 и без каких-либо пробелов. Текущие помощники не поддерживают это, поэтому вы должны создать поля ввода формы самостоятельно.
вы можете конечно, реализовать свой собственный связующий, как этот: http://siphon9.net/loune/2009/12/a-intuitive-dictionary-model-binder-for-asp-net-mvc/
In ASP.NET MVC 4, связыватель модели по умолчанию будет связывать словари, используя типичный синтаксис индексатора словаря
property[key]
.если у вас
Dictionary<string, string>
в вашей модели, теперь вы можете привязать обратно к нему непосредственно со следующей разметкой:<input type="hidden" name="MyDictionary[MyKey]" value="MyValue" />
например, если вы хотите использовать набор флажков для выбора подмножества элементов словаря и привязки к одному и тому же свойству, вы можете сделать следующее:
@foreach(var kvp in Model.MyDictionary) { <input type="checkbox" name="@("MyDictionary[" + kvp.Key + "]")" value="@kvp.Value" /> }
основываясь на ответе @AntP, есть еще менее подробный способ, позволяющий MVC делать больше работы (по крайней мере, с
TextBoxFor()
наDictionary<string, string>
- Я не пробовалCheckBoxFor()
наDictionary<xxx, bool>
):@foreach(var kvp in Model.MyDictionary) { @Html.Label(kvp.Key); @Html.TextBoxFor(m => m.MyDictionary[kvp.Key]); }