2011-06-04 107 views
0

我有以下模型設計。ASP.NET MVC UpdateModel與集合的層次結構綁定

模板包含類別列表。 類別包含項目列表。

因此有3層的層次結構。由於UI設計要求在1頁上創建所有3個級別,所以我必須編寫一些自己的代碼才能使其工作。它看起來如下:

Page Design

我可以得到它提交回創建操作方法和的FormCollection如下所示。

FormValues for Create

我遇到的問題是,的UpdateModel工程模板和類別級但項目是不填充類別。 Html看起來如下。正如你所看到的,我使用了id的[guid_value] .Items [guid_value]語法。它不應該根據它自動判斷綁定嗎?

enter image description here

有什麼我丟失,或爲了得到結合工作呢?

回答

1

如果你想讓你的html正確地綁定到你的模型上,你必須注意你渲染的html。我可以用你的HTML看到的問題是

<input type='hidden' value = 'Items.Index' value= 'some_guid' autocomplete = 'off'/> 

與這個網站模型綁定將嘗試綁定物品爲模板對象的孩子在那裏找不到任何屬性命名項和這些值將不會被綁定到模型。你有你的隱藏字段更改爲

<input type='hidden' name = 'Categories[category's guid].Items.Index' value = 'some guid' autocomplete = 'off'/> 

,你必須只需要調用的UpdateModel在你的操作方法一樣

UpdateModel(yourobject); 

我沒有測試此代碼,但我比某些更是改變你的HTML這種方式會讓你排序。 @Mlchael Grassman你不必使用基於整數的id來綁定集合了。請參閱steve's post瞭解更多信息。實際上,你不需要GUID,而是一個隨機數,它是頁面上下文中唯一的數字,只要你使用名稱索引和值設置爲上述隨機數的額外隱藏字段即可。我已經使用(和修改)Steve編寫的BeginCollectionItem方法在asp.net mvc中發表了有關Master詳細信息表單的博客。在這個博客系列的部分one中,我簡單地展示瞭如何在沒有Ajax調用的情況下動態地在客戶端添加您的詳細記錄的字段。在second第一部分中,我將jQuery模板引擎的詳細記錄編輯器模板帶到了客戶端,就像它通過ajax調用呈現時一樣。

+0

這是它!謝謝穆罕默德。令人沮喪的事情之一是用於MVC的公約沒有被公開。你是怎麼弄明白這一切的? :-) – AboutDev 2011-06-05 03:18:09

+0

類別是你的對象的屬性,但項目不是。它的相當屬性的一個元素的類別,所以你必須把它分類[GUID] .Items.index其中GUID粗略地與類別集合中的ID – 2011-06-05 06:35:12

1

默認情況下,MVC使用以下慣例進行命名。

Category[0].Items[0] 
Category[0].Items[1] 
Category[1].Items[0] 
Category[1].Items[1] 

您可以通過使用以下TryUpdateModel包含您自己的更新。這woud可能需要某種循環,但應該讓你開始。

TryUpdateModel(Category[Guid].Items[Guid], "Category[Guid].Items[Guid]", null, new string[] { "ExcludedPropery1", "ExcludedPropery2", "ExcludedProperyN", }); 
+0

我該怎麼做。寫一個循環去從FormValues獲取GUID? guid是通過這裏的相同方法爲我創建的。 http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ – AboutDev 2011-06-04 20:57:30

+0

我只是指出了MVC在其中使用TryUpdateModel的默認行爲。如果你想堅持quids,你必須提供哪些對象應該映射到哪個表單集合。基本上你通過表單集合循環,並做什麼mvc與它基於int的索引。我不相信MVC會爲你做這件事。但我可能是錯的。 – 2011-06-04 21:01:02

+0

感謝您的反饋Michael。有沒有辦法寫一個自定義綁定方法,這將允許我重寫使用帶有guid的整數?因爲從技術上來說類別[0]和類別[GUID_VALUE]不應該真的如此不同。或者更好的是,是否有更標準的方法來實現這種設計而不使用GUID。 – AboutDev 2011-06-04 21:06:06