【问题标题】:ASP.NET web forms model binding nested collectionASP.NET Web 窗体模型绑定嵌套集合
【发布时间】:2016-08-03 06:40:24
【问题描述】:

我不知道如何在 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的插入方法是这样的:

public void Entry_InsertItem(ExperimentViewModel item)

我在 ??? 中尝试了各种标记部分,例如带有具有此签名的 SelectMethod 的 ListView:

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

这可以显示正确的表单,但在回发时 ExperimentViewModel.Measurements 始终为空。我还尝试了列表视图上的插入方法和中继器无济于事。

我显然可以手动执行此操作,但我认为必须有一种使用模型绑定的标准方法来执行此操作。显然,我必须定义一个实际绑定到 ExperimentViewModel.Measurements 的控件,但我不确定如何在此设置中执行此操作。

【问题讨论】:

标签: c# asp.net webforms model-binding asp.net-4.5


【解决方案1】:

您可以使用DataSource="&lt;%# Item.Measurements %&gt; 绑定子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>

我不肯定这些值将在回发时填充。您可能必须在插入方法中重新填充模型。我不确定您在子模板中到底要做什么。希望这会有所帮助。

【讨论】:

  • 在回发时填充子集合是问题所在。您的建议不起作用,在嵌套的 ListView 上使用 SelectMethod 也不起作用。考虑一个 ExperimentEntryForm,您可以在其中选择实验类型,并为该类型的实验提供一个测量列表(键值对)。您将如何使用 Web 表单模型绑定来表示这一点,以便在 FormView 更新事件中填充 ExperimentViewModel.Measurements?目前没有答案:stackoverflow.com/questions/21667583/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多