[英]Web forms model binding child collection
我不知道如何像在 MVC 中那樣使用模型綁定來更新子集合。 所有集合類型的控件似乎都假定某種使用編輯/更新生命周期的服務器端存儲機制,如果這應該是一個插入表單,我想將子集合存儲在表單本身中,則這種機制不適合。
public class BarViewModel
{
public string Name {get;set;}
}
public class FooViewModel
{
public string Description {get;set;}
public List<BarViewModel> Bars {get;set;}
}
我可以在里面使用什么??? 部分在這里:
<asp:FormView ID="Entry" RenderOuterTable="false" runat="server" DefaultMode="Insert"
ItemType="FooViewModel" SelectMethod="Entry_GetItem" InsertMethod="Entry_InsertItem">
<InsertItemTemplate>
<asp:TextBox ID="txtDescription" Text="<%# BindItem.Description %>" runat="server" />
<!-- ??? -->
</InsertItemTemplate>
</asp:FormView>
這樣我就可以編寫一個執行 TryUpdateModel 的 InsertMethod,並且子集合填充來自 ??? 的值。
我試過中繼器、網格視圖和列表視圖,但它們似乎都不起作用。 這個問題在網上似乎沒有任何答案 [1],但似乎應該是一個明顯的場景,並且在 MVC 中很簡單。
我能找到的唯一可行的解決方案是在每個條目的嵌套視圖上手動調用 UpdateItem。 基本上,FormView 的 UpdateMethod 將迭代預期的項目數,這些項目也可以存儲在表單中,然后我會在嵌套的 ListView 上調用 UpdateItem(index, false):
FooViewModel foo;
BarViewModel bar;
public void Foo_UpdateItem([Control("BarCount")] int? barCount)
{
TryUpdateItem(foo);
var bars = (ListView)Entry.FindControl("FooBars");
for (var i = 0; i < barCount; ++i)
{
bar = foo.Bars[i];
bars.UpdateItem(i, false);
}
}
這為要調用的嵌套 ListView 的 UpdateMethod 建立了適當的上下文,並且一切都按預期工作。 這是一個黑客,但它的工作原理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.