在回发时从中继器捕获更改的值

本文关键字:中继器 | 更新日期: 2023-09-27 18:03:29

这一直困扰着我,我读过无数的解决方案,但似乎都有点偏离。我有一个中继器,每个项目有2个下拉列表和一些项目。这些都有潜在的值0-8,用户可以选择,我想在用户单击页面底部的按钮时收集回发数据。

    <asp:Repeater ID="rptPricing" runat="server" OnItemDataBound="rptPricing_OnItemDataBound">
    <ItemTemplate>
        <div class="Row clear">
            <div class="Column Cat"><%# ((Price)Container.DataItem).AgeCategory %></div>
            <div id="dWasPrice" runat="server" class="Column Was">
                <asp:Literal ID="litPreviousPrice" runat="server" /><span class="strike"></span>
            </div>
            <div class="Column Now">$<%# ((Price)Container.DataItem).FullPrice %></div>
            <div class="Column Deposit">
                <asp:DropDownList ID="ddlCountForPart" runat="server" skucode="<%# ((Price)Container.DataItem).PartHeaderCode %>">
                    <asp:ListItem Text="0" Value="0"></asp:ListItem>
                    <asp:ListItem Text="1" Value="1"></asp:ListItem>
                    <asp:ListItem Text="2" Value="2"></asp:ListItem>
                    <asp:ListItem Text="3" Value="3"></asp:ListItem>
                    <asp:ListItem Text="4" Value="4"></asp:ListItem>
                    <asp:ListItem Text="5" Value="5"></asp:ListItem>
                    <asp:ListItem Text="6" Value="6"></asp:ListItem>
                    <asp:ListItem Text="7" Value="7"></asp:ListItem>
                    <asp:ListItem Text="8" Value="8"></asp:ListItem>
                </asp:DropDownList>                        
            </div>
            <div class="Column Full">
                <asp:DropDownList ID="ddlCountForFull" runat="server" skucode="<%# ((Price)Container.DataItem).FullHeaderCode %>">
                    <asp:ListItem Text="0" Value="0"></asp:ListItem>
                    <asp:ListItem Text="1" Value="1"></asp:ListItem>
                    <asp:ListItem Text="2" Value="2"></asp:ListItem>
                    <asp:ListItem Text="3" Value="3"></asp:ListItem>
                    <asp:ListItem Text="4" Value="4"></asp:ListItem>
                    <asp:ListItem Text="5" Value="5"></asp:ListItem>
                    <asp:ListItem Text="6" Value="6"></asp:ListItem>
                    <asp:ListItem Text="7" Value="7"></asp:ListItem>
                    <asp:ListItem Text="8" Value="8"></asp:ListItem>
                </asp:DropDownList>
            </div>
        </div>
    </ItemTemplate>
</asp:Repeater>

这是装订。

private void BindDetails()
{
    SetDiscountContent();
    rptPricing.DataSource = _Detail.Prices;
    rptPricing.DataBind();
}

这是数据不存在的地方。

if ( IsPostBack && UIControlUtil.GetPostBackControl(Page) == lnkAddToCart)
{
    //populate the cart without javascript
    //find the drop down with items selected and create Order Elements
    try
    {
        var orders = new Order[0];
        foreach (RepeaterItem item in rptPricing.Items)
        {
            var dl = item.FindControl("ddlCountForFull");
            if (dl != null)
            {
                Array.Resize(ref orders, orders.Length + 1);
                orders[orders.Length - 1] = new Order() {
                    Quantity = Convert.ToInt32(dl.SelectedValue),
                    Sku = dl.Attributes["skucode"]};

我已经尝试将对BindDetails()的调用从PageLoad移动到OnInit,并使用回发标志。我也玩过ViewState旗,但都没用。

EDIT(添加页面加载(,请注意,我已经玩过将其移动到OnInit。

 protected void Page_Load(object sender, EventArgs e)
    {
        if (ContentItem == null) return;
        if (!IsPostBack)
        {
            var control = (ContentManagement.Library.Sitecore.PreDefinedControl)ContentItem;
            _Detail = (Details)control.DataElements[0];
            BindDetails();
        }
        if (ShoppingCartHelper.GetProductsOfTInCart<blah>() > 8)
        {
            lnkAddToCart.Enabled = false;
            lnkAddToCart.CssClass = lnkAddToCart.CssClass + " disabled cartmax";
        }
    }

在回发时从中继器捕获更改的值

首先要确保您正在执行:

if (!IsPostBack)
{
    BindDetails();
}

这将确保您不会与每次回发绑定并丢失数据。

此外,我不理解的必要性

if ( IsPostBack && UIControlUtil.GetPostBackControl(Page) == lnkAddToCart)

为什么不为ButtonLinkButton实现OnClick处理程序,并将所有代码从repeated中提取数据到处理程序中?

还要确保启用了ViewState,否则您将无法在Repeater中迭代以查找更改的值。

编辑:

请检查您是否在存在Repeater的容器中禁用了ViewState。您应该有数据。唯一不这样做的原因是,如果ViewState在控件或其父对象上被禁用,或者您正在以某种方式擦除值,例如重新绑定。你能发布更多像Page_Load这样的代码,以及之后会发生的任何事件吗?

试着在Repeater后面放一个TextBox,在其中输入soem文本,然后发布你的Repeater。你能看到你输入的TextBox中的文字吗?如果没有,则父控件已禁用ViewState或在页面级别禁用。如果你能看到这个值,那么在某个地方你无意中重新绑定到了Repeater并擦除了你的数据。您需要在执行绑定的地方放置一个断点,并确保在返回时不会发生这种情况。

在这一点上,我不能给你更多的帮助了。