【问题标题】:ASP.NET Repeater not binding after ItemCommandASP.NET 中继器在 ItemCommand 之后未绑定
【发布时间】:2010-10-29 18:01:23
【问题描述】:

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

                <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 对象。尽管通过跟踪可以看到 BindItems() 方法像往常一样被调用,并且篮子在那里。

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

有什么想法吗?

谢谢 邓肯

【问题讨论】:

    标签: asp.net repeater


    【解决方案1】:

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

    HTH。

    【讨论】:

    • 感谢您回复我。我很难理解(可能是因为现在是晚上 7.15!),因为我看不出我正在做的事情有什么问题。请记住,上面概述的 Page_Load 是在我的用户控制之下......所以现在应该已经从转发器的数据绑定中收到了篮子?除非那是我要去错的地方?
    • 什么时候再装订?篮子不会在页面回发中持续存在,据我所见,重新绑定需要在页面加载触发之前发生,而这可能不是。
    • 我现在正在绑定 PageLoad,就像 weblogs.asp.net/infinitiesloop/archive/2006/10/16/…2800_Part-4_2900.aspx 告诉我的那样!
    • 好的破解它。谢谢 - 昨晚我无法理解它。你是对的,它应该发生在中继器上的 ItemDataBound 中 - 然后我可以找到我的用户控件并将 dataItem 传递给它。如果有人觉得它有用,我已经在这里写了 - binaryforge-software.com/Blog/2010/10/30/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多