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 建立了正确的上下文,一切都按预期进行。这是一个黑客,但它有效。
我不知道如何像在 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 建立了正确的上下文,一切都按预期进行。这是一个黑客,但它有效。