2011-03-04 51 views
47

我试图绑定MVC中的字典值。ASP.NET 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属性为空?

回答

49

你应该看看这个帖子从斯科特汉塞尔尔曼: 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/

73

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

感谢这个,相当不错的方式进行绑定。 – valentin

+1

祝你一天愉快! – kingdango

+5

有人可以提供任何链接到更详细的答案吗?试过字典,它没有解决,所以我不得不使用旧的索引器语法。 –

13

大厦@ ANTP的回答,有一个甚至更简洁的方式,让MVC做更多的工作(至少与TextBoxFor()Dictionary<string, string> - 我还没有一个Dictionary<xxx, bool>试图CheckBoxFor()):

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

'CheckBoxFor'可以使用'Dict ',但它不适用于任何想要绑定特定键/值对(值不仅仅是布尔值)的情况 - 要做到这一点需要自己构建标记(如我的示例)。 –

+0

为什么这只适用于布尔值?我也得到了Dict 的作用,而且我也不明白为什么它不适用于其他数据类型。 –

+0

@KaiWeber - 这可能适用于任何'字典'(实际上,''是我在答案中使用的)。但是,我没有用其他方法测试过它。我认为Ant P说它只适用于类型化词典('Dictionary <>'),而不是非泛型集合,如[IDictionary](https://msdn.microsoft.com/en-us/library/system .collections.idictionary.aspx) – Sphinxxx