KP.*_*KP. 5 asp.net-mvc modelbinders master-detail
我修改了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>
Run Code Online (Sandbox Code Playgroud)
它呈现这个:
<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>
Run Code Online (Sandbox Code Playgroud)
我没有修改DinnersControler的Post Edit Action方法.父母的晚餐照常更新,但它似乎是UpdateModel(晚餐); 没有看到/更新子RSVP记录.
我已经尝试了一些渲染子记录的变体,以便模型绑定器可以看到集合,没有运气.
通过调用UpdateModel(Parent)一次更新父/子记录; 可能与当前的模型粘合剂?
我自己还无法做到这一点。
我知道您可以自动更新单个子元素,即 Dining.RSV。我从未见过更新子枚举的能力,这需要绑定知道哪个属性是 ID 并查找它(即,Dinner.RSVP.Where(r => r.RSVP_ID == input_id),然后更新一下)。我对自定义绑定了解不够,无法做类似的事情。
但是,我所做的是执行一个循环并指定 rsvp 和 int 作为前缀:
所以你也是:
UpdateModel("Dinner", Dinner);
Run Code Online (Sandbox Code Playgroud)
更新父级,然后:
int i = 0;
foreach (var r in Dinner.RSVPs) {
UpdateModel(r, "Dinner.RSVPs[" + i++ + "]");
}
Run Code Online (Sandbox Code Playgroud)
不太干净,但对我来说效果很好。不过,构建验证可能需要花费更多的精力(您希望同时验证所有内容,并确保不会跳回第一个 RSVP 时出现错误的视图)。
编辑:修复了代码以反映OP的解决方案,包括我的参数顺序中的错误。话虽如此,我更喜欢使用 RSVP.ID 属性而不是运行整数。只要您知道 Dining.RSVPs 在 POST 上与 GET 上的相同(我在代码中对此很有信心),那么使用 RSVP.ID 就可以了。如果回复不同,则只有两者中都存在的回复才会更新。但是,使用顺序 int 可能会导致更新错误的对象。
希望有帮助,詹姆斯
| 归档时间: |
|
| 查看次数: |
3401 次 |
| 最近记录: |