Получение измененных значений из повторителя при обратной передаче - PullRequest
1 голос
/ 26 июля 2011

Это мучает меня, и я прочитал бесчисленные решения, которые, кажется, все немного не так. У меня есть повторитель, у которого есть 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 безрезультатно.

РЕДАКТИРОВАТЬ (Добавление загрузки страницы), обратите внимание, что я играл с перемещением этого в 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";
        }
    }

1 Ответ

2 голосов
/ 26 июля 2011

Прежде всего, убедитесь, что вы делаете:

if (!IsPostBack)
{
    BindDetails();
}

Это позволит вам не связываться с каждым постбэком и не потерять ваши данные.

Также я не понимаю необходимости:

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

Почему вы не просто реализуете обработчик OnClick для Button или LinkButton и перемещаете весь свой код, чтобы извлечь данные из повторяющегося в обработчик?

Также убедитесь, что ViewState включен, иначе вы не сможете перебрать Repeater, чтобы найти измененные значения.

EDIT:

Убедитесь, что вы не отключили ViewState в контейнерах, в которых существует Repeater. У вас должны быть данные. Единственная причина, по которой вы этого не сделаете, это то, что ViewState отключено на элементе управления или на одном из его родителей, или вы стираете значения каким-либо образом, например, привязываете. Можете ли вы опубликовать больше своего кода, например, Page_Load и любое событие, которое произойдет после него?

Попробуйте ввести TextBox после Repeater и введите в него текст соема, а затем опубликуйте свой Repeater. Можете ли вы увидеть текст в TextBox, который вы ввели? Если нет, то родительский элемент управления отключил ViewState или на уровне страницы. Если вы видите значение, то где-то вы непреднамеренно привязываетесь к Repeater и стираете ваши данные. Вам нужно поставить точку останова, где вы делаете привязку, и убедиться, что она НЕ происходит, когда вы отправляете обратно.

На данный момент я не могу оказать вам больше помощи.

...