Web 表单模型绑定子集合

Web forms model binding child collection

我不知道如何像在 MVC 中那样使用模型绑定来更新子集合。所有集合类型的控件似乎都采用某种使用 edit/update 生命周期的服务器端存储机制,如果这应该是一个插入表单,我想将子集合存储在表单本身中,则不适合.

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,并且子集合会填充来自 ???

的值

我试过中继器、网格视图和列表视图,其中 none 似乎有效。这个问题在网上好像没有答案[1],不过看起来应该是一个明显的场景,而且在MVC中很简单。

[1] ASP.NET Web Forms 4.5 model binding where the model contains a collection

我能找到的唯一可行的解​​决方案是手动在每个条目的嵌套视图上调用 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 建立了正确的上下文,一切都按预期进行。这是一个黑客,但它有效。