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?
Ответы
Ответ 1
вы должны взглянуть на этот пост от scott hanselman:
http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx
Связующее по умолчанию просто понимает словари в формате:
params[0].key = kvp.key
params[0].value = kvp.value
Индекс параметра должен быть последовательным, начиная с 0 и без пробелов. Текущие помощники не поддерживают это, поэтому вы должны сами создать поля ввода формы.
вы можете, конечно, реализовать свое собственное связующее, например:
http://siphon9.net/loune/2009/12/a-intuitive-dictionary-model-binder-for-asp-net-mvc/
Ответ 2
В 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" />
}
Ответ 3
На основе ответа @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]);
}