在ItemCommand之后ASP.NET Repeater不绑定

时间:2010-10-29 18:01:23

标签: asp.net repeater

我有一个循环用户控件的转发器,如下所示:

                <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就在那里。

我认为这与生命周期有关,但它让我受伤。

有什么想法吗?

由于 邓肯

1 个答案:

答案 0 :(得分:2)

让公共字段存储绑定项目有点危险,尤其是当您有多个项目时。更安全的方法是将Basket提取为绑定到转发器的DataItem,并在转发器ItemCommand事件中以这种方式执行某些操作。 ItemDataBound会更安全,因为你知道篮子会存在(因为它是数据绑定的),Page_Load在这里不是一个安全的选择......

HTH。

相关问题