我无法弄清楚如何在Web表单中使用模型绑定来填充视图模型的子集合。假设我有以下内容:
public class MeasurementViewModel
{
public string Name {get;set;}
public int MeasurementTypeId {get;set;}
public double Value {get;set;}
}
public class ExperimentViewModel
{
public bool ExperimentAorB {get;set;}
public List<MeasurementViewModel> Measurements {get;set;}
}
因此有两种类型的实验,A或B,每种都需要不同的测量集。我想在一个页面上完成所有操作,以便用户选择实验类型,然后显示要通过简单文本框输入的测量列表。这在MVC中很简单,但是我不知道如何做到这一点的网页表单。
<asp:DropDownList ID="ddExperiment" runat="server" CssClass="form-control" AutoPostBack="true"
DataValueField="Id" DataTextField="Description"
SelectMethod="ddPartCode_GetData" />
<asp:FormView ID="Entry" RenderOuterTable="false" runat="server" DefaultMode="Insert" Visible="<%# !string.IsNullOrEmpty(ddExperiment.SelectedValue) %>"
ItemType="ExperimentViewModel" SelectMethod="Entry_GetItem" InsertMethod="Entry_InsertItem">
<EditItemTemplate>
<asp:TextBox ID="txtName" Text="<%# BindItem.Name %>" runat="server" />
<!-- ??? -->
</EditItemTemplate>
</asp:FormView>
FormView的insert方法如下:
public void Entry_InsertItem(ExperimentViewModel item)
我在???中尝试了各种标记? section,就像带有此签名的SelectMethod的ListView一样:
public IEnumerable<MeasurementViewModel> Measurements_GetData(
[Control("ddExperiment")] int experimentType) ...
用于显示正确的表单,但在回发时,ExperimentViewModel.Measurements始终为null。我也尝试过列表视图中的插入方法和转发器无效。
我显然可以手动执行此操作,但我认为必须有一种使用模型绑定的标准方法。显然我必须定义一个实际绑定到ExperimentViewModel.Measurements的控件,但我不确定如何在此设置中执行此操作。
答案 0 :(得分:0)
您可以使用ListView
绑定儿童DataSource="<%# Item.Measurements %>
。这是一个例子:
<asp:FormView ID="FormView" runat="server" RenderOuterTable="false" ItemType="ExperimentViewModel" DataKeyNames="Id" DefaultMode="Edit" SelectMethod="FormView_GetItem" UpdateMethod="FormView_UpdateItem">
<EmptyDataTemplate>
The record you requested does not exist.
</EmptyDataTemplate>
<EditItemTemplate>
<asp:ListView ID="ListView" runat="server" ItemType="MeasurementViewModel" DataKeyNames="Id" DataSource="<%# Item.Measurements %>">
...
</asp:ListView>
</EditItemTemplate>
</asp:FormView>
我不肯定这些值会在回发时填充。您可能必须在insert方法中重新填充模型。我不确定你在儿童模板中想要做什么。希望这会有所帮助。