2010-10-29 73 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

相關問題