我無法發佈包含一個字典的表單,該表單包含一個int值作爲鍵和一個對象列表作爲值。在MVC4中綁定包含列表的字典
本來這只是對象列表和工作的罰款和類型是:
List<MyObject> Fields
工作標記爲
Fields_{0}__Property1
其中{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>>.
我測試所需要的格式,當我們使用Html.HiddenFor渲染字典,所以我已經添加了所需的格式也就是現在的隱藏字段:
@Html.HiddenFor(m => m.Property1, new { Name = string.Format("Fields[{0}][{1}].Property1", Model.Index, Model.Position), @id = string.Format("Fields_{0}__{1}__Property1", Model.Index, Model.Position) })
現在字段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是足夠聰明的渲染上認爲,這一複雜對象的字段,但沒有足夠的智慧收集它們放回視圖模型,當我們回來後。
我發現this other guy誰在這裏有類似的問題,他通過不使用字典來解決它,而是創建一個複雜的對象。不過,我想知道是否有更快的方法,不需要我重寫整個系統。
任何想法?
更新
我採取DefaultModelBinder的源代碼,並調整它解決它。 我找到了源here。我沒有創建我自己的Binder,因爲我想要將所有高級功能和驗證規則應用於所有其他元素。 一旦我得到了DefaultModelBinder編譯和工作,我發現字典未能投射覆雜項目的部分,並寫了一個自定義的字典更新方法,解決了這個問題
你能發佈你的修改嗎? –