2016-04-12 60 views
0

我无法弄清楚如何在Web表单中使用模型绑定来填充视图模型的子集合。假设我有以下几点:ASP.NET 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中很简单,但我坚持使用Web表单,但不清楚如何执行此操作。

<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控件的插入方法是这样的:

public void Entry_InsertItem(ExperimentViewModel item) 

我试着在各种标记???部分,像这种签名SelectMethod一个ListView:

public IEnumerable<MeasurementViewModel> Measurements_GetData(
    [Control("ddExperiment")] int experimentType) ... 

工程,以显示正确的形式,而是回传ExperimentViewModel.Measurements总是空。我也试过在列表视图和转发器上插入方法无济于事。

我明显可以做到这一点手动,但我想必须有一个标准的方式来做到这一点使用模型绑定。显然我必须定义一个实际绑定到ExperimentViewModel.Measurements的控件,但我不知道如何在此设置中执行此操作。

+0

相同的解决方案,发布在这里适用:http://stackoverflow.com/questions/36804682/web-forms-model-binding-child-collection – naasking

回答

0

您可以通过使用DataSource="<%# Item.Measurements %>来绑定孩子ListView。这里是一个例子:

<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> 

我不积极的价值将在回发填充。您可能必须在插入方法中重新填充模型。我不确定你想要在子模板中做什么。希望这可以帮助。

+0

在回发上填充子集合是问题。你的建议不起作用,在嵌套的ListView上也不能使用SelectMethod。 考虑一个ExperimentEntryForm,您可以在其中选择实验类型,并给出该类型实验的测量(键值对)列表。您如何使用Web表单模型绑定来表示这样的情况,以便在FormView更新事件上填充ExperimentViewModel.Measurements? 目前还没有答案:http://stackoverflow.com/questions/21667583/asp-net-web-forms-4-5-model-binding-where-the-model-contains-a-collection – naasking