C# 4.0 在MVC4中绑定包含列表的词典

C# 4.0 在MVC4中绑定包含列表的词典,c#-4.0,asp.net-mvc-4,dictionary,postback,.net,C# 4.0,Asp.net Mvc 4,Dictionary,Postback,.net,我在发布一个表单时遇到问题,该表单包含一个字典,其中包含一个int作为键,一个对象列表作为值 最初,这只是一个对象列表,工作正常,类型为: List<MyObject> Fields 其中{0}是对象的索引。为了让它发回对象列表,我使用隐藏字段渲染了对象,如下所示: @Html.HiddenFor(m => m.Property1, new { Name = string.Format("Fields[{0}].Property1", Model.Index), @id

我在发布一个表单时遇到问题,该表单包含一个字典,其中包含一个int作为键,一个对象列表作为值

最初,这只是一个对象列表,工作正常,类型为:

List<MyObject> Fields
其中{0}是对象的索引。为了让它发回对象列表,我使用隐藏字段渲染了对象,如下所示:

  @Html.HiddenFor(m => m.Property1, new { Name = string.Format("Fields[{0}].Property1", Model.Index), @id = string.Format("Fields_{0}__Property1", Model.Index) })
这很有效。然而,现在我们有了字典而不是列表,列表就在字典里

现在的类型是:

Dictionary<int, List<MyObject>>.
现在字段id为

Fields_{0}__{1}__Property1
其中{0}是字典的键,{1}是列表中对象的索引

然而,在回邮时,我现在得到了

 [InvalidCastException: Specified cast is not valid.]
   System.Web.Mvc.CollectionHelpers.ReplaceDictionaryImpl(IDictionary`2 dictionary, IEnumerable`1 newContents) +131
我猜MVC足够聪明,可以在视图上渲染这个复杂对象的字段,但不足以在我们发回时将它们收集回viewmodel

我在这里发现了一个类似的问题,他没有使用字典而是创建了一个复杂的对象来解决这个问题。然而,我想知道是否有一种更快的方法不需要我重写整个系统

有什么想法吗


更新

我通过获取DefaultModelBinder的源代码并对其进行调整,解决了这个问题。 我找到了源头。我没有创建自己的活页夹,因为我想将所有高级功能和验证规则应用于所有其他元素。
在获得DefaultModelBinder编译和工作后,我找到了字典无法强制转换复杂项的部分,并编写了一个自定义字典更新方法,解决了这个问题

您始终可以创建一个自定义模型绑定器,完全按照您的需要从请求值绑定对象。只需创建一个实现
System.Web.Mvc.IModelBinder
接口的类,并实现
BindModel()
方法。

是的,尽管编写自定义对象的工作量可能要少得多,但我猜这是一种6/1,半打的其他场景。您可以研究的另一件事是可以在动作方法及其参数上标记的属性,以向默认模型绑定器提供更多信息。我知道的一个是
Bind
属性,不确定是否还有其他属性。你能发布你的更改吗?
Fields_{0}__{1}__Property1
 [InvalidCastException: Specified cast is not valid.]
   System.Web.Mvc.CollectionHelpers.ReplaceDictionaryImpl(IDictionary`2 dictionary, IEnumerable`1 newContents) +131