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?

86429 次浏览

你应该看看 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/

在 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 完成更多的工作(至少在 Dictionary<string, string>上使用 TextBoxFor()——我还没有在 Dictionary<xxx, bool>上使用 CheckBoxFor()) :

@foreach(var kvp in Model.MyDictionary)
{
@Html.Label(kvp.Key);
@Html.TextBoxFor(m => m.MyDictionary[kvp.Key]);
}