我有一个循环用户控件的转发器,如下所示:
<asp:Repeater ID="repItems" runat="server" EnableViewState="false"
OnItemCommand="repItems_ItemCommand">
<ItemTemplate>
<dmg:confirmItem runat="server"
OnDataBinding="confirmitemItem_DataBinding"
Basket="<%# Container.DataItem %>" />
</ItemTemplate>
</asp:Repeater>
我的代码背后是这样的:
public void BindItems(List<ShopBasket> baskets)
{
_baskets = baskets;
repItems.DataSource = baskets;
repItems.DataBind();
}
我的自定义用户控件如下所示:
public ShopBasket Basket;
protected void Page_Load(object sender, EventArgs e)
{
imgItem.ImageUrl = ShopImagePath + Basket.ImageFilename;
...etc...
}
所有作品都是第一次出色地完成,篮子物品被束缚在篮子物品上,一切都很棒。
然而,当我从我的转发器收到一个ItemCommand,并更新篮子内容时(注意:这里没有添加或删除,只是更新数量)然后我重新绑定以查看最新的值,然后BOOM!空引用 - 用户控件Page_Load中没有Basket对象。尽管如此,仍然可以看到BintItems()方法像往常一样被调用,并且Baskets就在那里。
我认为这与生命周期有关,但它让我受伤。
有什么想法吗?
由于 邓肯
答案 0 :(得分:2)
让公共字段存储绑定项目有点危险,尤其是当您有多个项目时。更安全的方法是将Basket提取为绑定到转发器的DataItem,并在转发器ItemCommand事件中以这种方式执行某些操作。 ItemDataBound会更安全,因为你知道篮子会存在(因为它是数据绑定的),Page_Load在这里不是一个安全的选择......
HTH。