ASP.NET MVC 绑定到字典
Posted
技术标签:
【中文标题】ASP.NET MVC 绑定到字典【英文标题】:ASP.NET MVC Binding to a dictionary 【发布时间】:2011-07-08 15:47:33 【问题描述】:我正在尝试在 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
属性为空?
【问题讨论】:
【参考方案1】:在 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" />
【讨论】:
谢谢你,一个很好的绑定方式。 有人可以提供任何链接到更详细的答案吗?尝试了 Dictionary你应该看看 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/
【讨论】:
【参考方案3】:以@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]);
【讨论】:
CheckBoxFor
可以与Dict<string, bool>
一起使用,但在您想要绑定回特定键/值对且值不仅仅是布尔值的任何情况下它都不起作用 - 这样做您需要自己构建标记(如我的示例所示)。
为什么这只适用于布尔值?我得到这个也适用于 DictDictionary<X, Y>
(事实上,<string, string>
是我在回答中使用的)。但是,我没有用其他任何东西对其进行测试。我认为 Ant P 说的是它只适用于类型化字典 (Dictionary<>
),而不适用于非泛型集合,如 IDictionary
我刚刚使用Dictionary<Enum, string>
进行了尝试,但没有成功。如果我改用Dictionary<string, string>
,它可以工作。有人对此有解释吗?
我的经验是值可以是任何值,但键必须是string
而不是int
。也许模型绑定器将其与位置参数混淆了。以上是关于ASP.NET MVC 绑定到字典的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ASP.Net MVC 模型绑定器将空 JSON 数组绑定到 null?