2009-07-09 76 views
5

我已經修改了Nerd Dinner應用程序中加入以下代碼到DinnerForm.ascx更新父/與ASP.Net MVC模型綁定子記錄

<p> 
    <%int i = 0; 
    foreach (NerdDinner.Models.RSVP rsvp in this.Model.Dinner.RSVPs) 
     { %> 

     <%= Html.Hidden("Dinner.RSVPs[" + i + "].RsvpID", rsvp.RsvpID)%> 
     <%= Html.Hidden("Dinner.RSVPs[" + i + "].DinnerID", rsvp.DinnerID)%> 
     <%= Html.TextBox("Dinner.RSVPs[" + i + "].AttendeeName", rsvp.AttendeeName)%> 
    <% i += 1; 
    } %> 
    </p> 

它渲染這個允許的子記錄編輯:

<p> 
    <input id="Dinner_RSVPs[0]_RsvpID" name="Dinner.RSVPs[0].RsvpID" type="hidden" value="36" /> 
     <input id="Dinner_RSVPs[0]_DinnerID" name="Dinner.RSVPs[0].DinnerID" type="hidden" value="63" /> 
     <input id="Dinner_RSVPs[0]_AttendeeName" name="Dinner.RSVPs[0].AttendeeName" type="text" value="kp" /> 
    <input id="Dinner_RSVPs[1]_RsvpID" name="Dinner.RSVPs[1].RsvpID" type="hidden" value="37" /> 
     <input id="Dinner_RSVPs[1]_DinnerID" name="Dinner.RSVPs[1].DinnerID" type="hidden" value="63" /> 
     <input id="Dinner_RSVPs[1]_AttendeeName" name="Dinner.RSVPs[1].AttendeeName" type="text" value="jim" /> 

    </p> 

我還沒有修改DinnersControler的Post Edit Action方法。家長晚餐照常更新,但它出現UpdateModel(晚餐);沒有看到/更新孩子RSVP記錄。

我已經嘗試了一些渲染子記錄的變體,以便模型粘合劑將看到集合,但沒有運氣。

正在通過調用UpdateModel(Parent)更新一次性父/子記錄;目前的模型粘合劑可能嗎?

回答

4

我一直無法自己做到這一點。

我知道你可以自動更新一個子元素,即Dinner.RSV。我從來沒有見過更新子枚舉的能力,這需要綁定知道哪個屬性是ID並查找它(即Dinner.RSVP.Where(r => r.RSVP_ID == input_id),然後更新)。我不太瞭解自定義綁定來做類似的事情。

不過,我所做的是做一個循環,並指定RSVP和INT作爲前綴:

所以你做的事:

UpdateModel("Dinner", Dinner); 

更新父,然後:

int i = 0; 

foreach (var r in Dinner.RSVPs) { 
    UpdateModel(r, "Dinner.RSVPs[" + i++ + "]"); 
} 

不是很乾淨,但它適用於我。雖然(您想要同時驗證所有內容,並確保不會跳回到第一個RSVP的視圖並顯示錯誤),但在構建驗證時可能需要更多努力。

編輯:修復了反映OP解決方案的代碼,包括我的參數順序中的一個錯誤。據說,我比使用運行的整數更適合使用RSVP.ID屬性。只要你知道Dinner.RSVPs在POST上與GET相同(我在我的代碼中確信這一點),那麼使用RSVP.ID就可以工作。如果RSVP不同,那麼只有兩者出現纔會更新。但是,使用順序int可能會導致錯誤的對象被更新。

希望幫助, 詹姆斯

+0

@jamesshannon此答案接近。修正你的更新模型在循環中讀取 int i = 0; (Dinner,RSVP中的RSVP r){ UpdateModel(r,「Dinner.RSVPs [」+ i +「]」); i ++; } 我們可以標記完成/回答。 – 2009-07-16 12:24:32

0

好的,沒人回答。我不知道nerddinner應用程序,但對你的問題感興趣。希望看到一些答案,但是,還沒有。不是100%肯定的,因爲不熟悉ndinner,但是它可能與this post有關,他們只在明確傳遞屬性時提及綁定/更新?

0

你的問題是,是否通過調用的UpdateModel(家長)更新一次拍攝父/子記錄;目前的模型粘合劑可能嗎?

是的,這是可能的。但是,如果您正在使用Linq-to-Sql並且您的子對象通過EntitySet<T>而不是像IList<T>之類的東西公開,則可以使用而不是(沒有一些小的變通辦法)。我相信這將會在ASP.NET 4.0的下一版MVC中得到解決。但是,目前,MVC默認模型綁定器似乎並不瞭解如何使用EntitySet。

請參閱本other answer我前一段時間在一個相關的問題寫道,約我現在如何處理(工作周圍)在某些簡單的情況下這種情況的詳細信息。在這樣做的時候,我不必再擔心這個解決方案從DDD/OOP的角度來看是多麼的「理想」,因爲我們只需簡單地讓MVC和LTS以最小的努力一起很好地一起玩。

請注意,我承認James S的解決方案可能更加「純粹」,但爲了在「一槍」中按照您的要求做到這一點,您需要等待ASP.NET 4.0或使用一種解決方法類似於您在其他帖子中找到的解決方法。

祝你好運!