2013-08-20 40 views
0

我無法發佈包含一個字典的表單,該表單包含一個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編譯和工作,我發現字典未能投射覆雜項目的部分,並寫了一個自定義的字典更新方法,解決了這個問題

+0

你能發佈你的修改嗎? –

回答

1

您可以隨時創建一個自定義模型綁定器來綁定對象請求值完全按照您的要求。只需創建一個實現System.Web.Mvc.IModelBinder接口並實現BindModel()方法的類。

+0

是的,雖然寫一個自定義對象的工作量可能比這個少很多 – Nick

+0

也許,我猜想其中有6個是1,6個是另一個。您可以研究的另一件事是可以在操作方法及其參數上標記的屬性,以向默認模型聯編程序提供更多信息。我所知道的是'Bind'屬性,不確定是否有其他屬性。 – asymptoticFault

相關問題