1

我正在尝试使用 ASP.NET 4.5 的模型绑定功能将 ListView 中显示的产品列表中的单个产品的详细信息加载到 FormView 控件中。

这一切都托管在一个 ASPX 页面中,该页面决定使用 Multiview 控件显示哪个页面。在一个视图中,我有显示所有产品的 ListView。在另一个视图中,我有 FormView 控件来显示/编辑单个产品的详细信息。当我单击 ListView 中的单个产品记录时,我想显示包含 FormView 的视图,并将该产品加载到 FormView 中以进行编辑或查看。

按照 WebForms 中模型绑定的方向,我已经定义了 FormView 的“SelectMethod”属性,该方法将 ProductId 作为其参数。此方法返回一个对应的 Product 对象。据我了解,在页面生命周期的某个地方调用此方法并自动加载 FormView。

现在,当我单击 ListView 中的记录以查看其详细信息时,它会触发 ItemCommand 事件处理程序。事件处理程序使用所选记录中的产品 Id 并检索与此 Id 对应的产品。

问题在于我需要将该产品绑定到 FormView。如何手动将产品分配为 FormView 绑定的模型?当我尝试手动设置 FormView 的 DataSource 时,出现错误:

"使用模型绑定时,不能在 'ProductForm' 上定义 DataSource 或 DataSourceID。 "

有没有其他人有这个类似的问题,并想出如何处理它?

谢谢,

G

4

1 回答 1

2

无需手动分配产品,因为数据绑定会为您完成这项工作。

首先,确保在 ListView 的每一行中都有某种 Button,CommandName 为 Select:

<asp:ListView ID="ProductList" runat="server" DataKeyNames="Id" ItemType="Product" SelectMethod="GetProductList">
<ItemTemplate>
    <%# Item.Name %>
    <asp:Button ID="SelectButton" runat="server" CommandName="Select" />
</ItemTemplate>
</asp:ListView>

其次,对于 FormView 的 SelectMethod,确保产品 id 参数具有指定的 Control 属性,其中传递给构造函数的字符串必须与 ListView 控件的 id 匹配:

public Product GetProduct([Control("ProductList")] int? id)
{
    if (id.HasValue)
    {
        return GetProductList().First(p => p.Id == id.Value);
    }
    return null;
}

这就是您需要做的所有事情,因为当单击 Select 按钮时,ListView 的 SelectedValue 会发生变化,并且会自动调用 GetProduct 方法并更新 FormView。

于 2013-07-21T19:44:21.407 回答