ASP.NET MVC绑定到字典


68

我正在尝试在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?

Answers:


60

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


92

在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" />
}

谢谢您,这是一种很好的绑定方法。
valentin

6
有人可以提供任何指向更详细答案的链接吗?尝试使用Dictionary <int,bool>并没有成功,所以我不得不使用旧的索引器语法。
亚历克斯·克劳斯

10
似乎不适用于数字键,但适用于字符串。
宽大处理

1
@Ant PI有两个输入文本框,一个用于键,一个用于值。我该如何映射这些?
sifa vahora

使用JavaScript将字段动态添加到html Dom时,如何使用此绑定字典?Ok
Opa114 '18

22

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

1
CheckBoxFor可以与a一起使用,Dict<string, bool>但是在任何您想要将特定的键/值对绑定在一起的情况下都无法使用,其中值不仅仅是一个布尔值-为此,您需要自己构建标记(如我的示例)。
Ant P

为什么这只对布尔值有效?我也将此方法用于Dict <string,string>,并且我不明白为什么它也不适用于其他数据类型。
凯·韦伯

@KaiWeber-这可能适用于任何人Dictionary<X, Y>(事实上​​,这<string, string>是我在回答中使用的)。但是,我还没有进行其他任何测试。我认为Ant P所说的是,它仅适用于类型化的字典(Dictionary<>),不适用于IDictionary
Sphinxxx '17

1
我只是使用尝试了此操作Dictionary<Enum, string>,但没有效果。如果我改用a Dictionary<string, string>,则可以。有人对此有解释吗?
nkaenzig

1
我的经验是,值可以是任何值,但键必须是string而不是int。也许模型联编程序将其与位置参数混淆了。
Arithmomaniac
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.