簡體   English   中英

Web 表單模型綁定子集合

[英]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 中很簡單。

[1] ASP.NET Web Forms 4.5 模型綁定,其中模型包含一個集合

我能找到的唯一可行的解​​決方案是在每個條目的嵌套視圖上手動調用 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.

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