我正在尝试使用ASP.NET 4.5的模型绑定功能将单个产品的详细信息从ListView中显示的产品列表加载到FormView控件中。
这全部托管在一个ASPX页面中,该页面决定使用Multiview控件显示哪个页面。在一个视图中,我有ListView显示所有产品。在另一个视图中,我有FormView控件来显示/编辑单个产品的详细信息。当我单击ListView中的单个产品记录时,我想显示包含FormView的视图,并将该产品加载到FormView中进行编辑或查看。
按照WebForms中模型绑定的方向,我已经使用一个以ProductId作为参数的方法定义了FormView的“SelectMethod”属性。此方法返回单个对应的Product对象。我的理解是,在页面生命周期的某个地方调用此方法并自动加载FormView。
现在,当我单击ListView中的记录来查看其详细信息时,它会触发ItemCommand事件处理程序。事件处理程序使用所选记录中的Product Id并检索与此Id对应的Product。
问题在于我需要将该产品绑定到FormView。如何手动将产品指定为FormView绑定的模型?当我尝试手动设置FormView的DataSource时,我收到错误:
“ DataSource或DataSourceID无法在'ProductForm'上定义 它使用模型绑定。“
还有其他人有这个类似的问题,并想出如何处理它?</ p>
谢谢,
答案 0 :(得分: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,请确保product 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。