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 55

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]);
}