ASP.NET MVC Привязка к словарю - PullRequest
62 голосов
/ 04 марта 2011

Я пытаюсь связать значения словаря в 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 ]

84 голосов
/ 08 сентября 2013

В 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" />
}
56 голосов
/ 04 апреля 2011

Вы должны взглянуть на этот пост от Скотта Хансельмана: 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/

21 голосов
/ 01 июня 2014

Опираясь на ответ @ 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]);
}
...