2010-10-29 72 views
1

我有一个循环用户控件的转发器,如下所示:在ItemCommand之后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就在那里。

我认为这与生命周期有关,但它让我击败了。

任何想法?

谢谢 Duncan

回答

2

这是一个有点危险,有一个公共领域的存储项目的约束,尤其是当你有多个项目。一种更安全的方法是将绑定的DataItem绑定到中继器,并在中继器的ItemCommand事件中以这种方式进行处理。 ItemDataBound会更安全,因为您知道该篮子将存在(因为它是数据绑定的),因此Page_Load在这里不是一个安全选项...

HTH。

+0

感谢您回复我。我很难理解(也许因为它是7.15pm!),因为我没有看到我在做什么错。请记住,上面列出的Page_Load是在我的用户控件上的......所以应该从中继器的数据绑定到现在应该收到Basket?除非那是我出错的地方? – Duncan 2010-10-29 18:18:35

+0

你什么时候再绑定?篮子不会在页面回传中持续存在,从我所看到的情况来看,重新链接需要在页面加载之前发生,这可能不是。 – 2010-10-29 19:24:55

+0

我现在绑定在PageLoad上,就像http://weblogs.asp.net/infinitiesloop/archive/2006/10/16/TRULY-Understanding-Dynamic-Controls-_2800_Part-4_2900_.aspx告诉我要做的一样! – Duncan 2010-10-30 09:34:27

相关问题