簡體   English   中英

使用ASP.Net MVC中的模型綁定器更新父/子記錄

[英]Updating Parent/Child Records with model binders in ASP.Net MVC

我修改了Nerd Dinner應用程序,允許通過將以下代碼添加到DinnerForm.ascx來編輯子記錄

  <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)一次更新父/子記錄; 可能與當前的模型粘合劑?

我自己無法做到這一點。

我知道您可以自動更新單個子元素,即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.RSVP在POST上與GET相同(我在我的代碼中對此有信心),那么使用RSVP.ID將起作用。 如果RSVP與RSVP不同,那么只有那兩個存在的RSVP才會更新。 但是,使用sequential int可能會導致更新錯誤的對象。

希望有所幫助,詹姆斯

好的,所以沒有人回答。 我不知道nerddinner應用程序,但對您的問題感興趣。 希望看到一些答案,但是,還沒有。 不是100%肯定,因為對ndinner不熟悉,但它是否與這篇文章有關 ,他們只在明確傳遞屬性時才提到綁定/更新?

您的問題是通過調用UpdateModel(Parent)來一次更新父/子記錄; 可能與當前的模型粘合劑?

是的,這是可能的。 然而,這是不可能的(不包括一些小的解決方法)如果你正在使用LINQ到SQL和你的孩子對象通過暴露EntitySet<T>而不是像IList<T> 我相信這將是(已經?)在ASP.NET 4.0的下一版MVC中解決的問題。 但就目前而言,MVC默認模型綁定器似乎並不了解如何使用EntitySet。

請看一下我之前在相關問題上寫的這個其他答案 ,詳細介紹了我在某些簡單情況下如何處理(解決)這種情況。 在這樣做的過程中,我不得不停止擔心這個解決方案從DDD / OOP的角度來看是多么“理想”,作為簡單地讓MVC和LTS以最小的努力很好地協同工作的權衡。

請注意,我承認James S的解決方案可能更“純粹”,但是為了按照您的要求“一次性”執行此操作,您需要等待ASP.NET 4.0,或者使用類似於你會在我的其他帖子中找到什么。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM