Как сделать AsyncPostBackTrigger для LinkButton в повторителе

На моей странице у меня есть внутренний повторитель LinkButton, но UpdatePanel не может найти LinkButton для AsyncPostBackTrigger.

Вот mycode.aspx

<asp:ScriptManager ID="Test1" runat="server" />
<asp:UpdatePanel ID="TestUpdate" runat="server" UpdateMode="Always">
<ContentTemplate>
<table width="100%">
<tr valign="top">
    <td width="50%">
        <asp:Repeater ID="productList" runat="server" onitemcommand="productList_ItemCommand">
        <HeaderTemplate>
        <ul type="disc">
        </HeaderTemplate>
        <ItemTemplate>
        <li>
            <asp:Label id="L1" runat="server" Text='<%# Eval("productName") %>'></asp:Label><br />
            Price:
            <asp:Label runat="server" Text='<%# Eval("productPrice") %>' ></asp:Label>&nbsp;Bath<br />
            <img alt="" src="Images/product/product<%# Eval("productID") %>.png" style="width: 200px; height: 130px" /><br />
            <asp:TextBox ID="num_product" runat="server" Text="0"></asp:TextBox><br />
            <asp:LinkButton ID="order_button" runat="server"><img alt="" src="~/Images/button/order.png" /></asp:LinkButton>
        </li>
        </ItemTemplate>
        <FooterTemplate>
        </ul>
        </FooterTemplate>
        </asp:Repeater> 
    <td>
    <span class="labelText">Order list</span>
        <asp:BulletedList ID="orderList" runat="server" BulletStyle="Numbered">
        </asp:BulletedList> 
    </td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>

Вот mycode.aspx.cs

protected void productList_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        //button
        /*LinkButton btn = new LinkButton();
        btn.ID = "order_button";
        btn.Click += LinkButton1_Click;
        Test1.RegisterAsyncPostBackControl(btn);*/

        LinkButton btn = (LinkButton)e.Item.FindControl("order_button");
        btn.Click += LinkButton1_Click;
        Test1.RegisterAsyncPostBackControl(btn);

            /*AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
            trigger.ControlID = btn.ClientID;
            trigger.EventName = "Click";
            TestUpdate.Triggers.Add(trigger);*/

    }
   protected void LinkButton1_Click(object sender, EventArgs e)
    {
        //string name = ProductName1.Text.ToString();
        //int price = System.Convert.ToInt32(ProductPrice1.ToString(), 10);
        //int number = System.Convert.ToInt32(TextBox1.ToString(),10);
        //orderList.Items.Clear();
        //orderList.Items.Add(new ListItem(name));
        //ListItem product1 = new ListItem();
        //product1.Text = name;
        orderList.Items.Add("test");
    }

Я пробовал много методов, но страница все еще обновляется. Есть ли у вас предложения?


person user1128331    schedule 03.01.2012    source источник
comment
Хотя ответ, который вы отметили как правильный, действительно правильный, правильный ответ принадлежит Мэтту Ф. Из-за того, что кнопка ссылки не генерируется с правильным идентификатором, вам необходимо зарегистрировать ее вручную. Если у него был правильный идентификатор, сгенерированный AutoID, скрипты обнаружат элемент управления и запустят запрос Ajax. Кроме того, гораздо проще изменить свойство, чем писать специальный код....   -  person Nuno Agapito    schedule 12.03.2018


Ответы (3)


Внутри события ItemCreated элемента управления Repeater зарегистрируйте кнопку с помощью ScriptManager.

//Inside ItemCreatedEvent
ScriptManager scriptMan = ScriptManager.GetCurrent(this);
LinkButton btn = e.Item.FindControl("order_button") as LinkButton;
if(btn != null)
{
    btn.Click += LinkButton1_Click;
    scriptMan.RegisterAsyncPostBackControl(btn);
}
person Eugene S.    schedule 03.01.2012
comment
Спасибо Евгений. Сэкономил много времени для меня. Ваше здоровье - person Nuthan Gowda; 11.06.2014
comment
Мне нужно было сделать обратное — заставить кнопку ссылки в ретрансляторе выполнять полную обратную передачу вместо асинхронной обратной передачи из панели обновлений. Это отлично сработало для этого. Я просто использовал scripMan.RegisterPostBackControl(btn) вместо этого. - person ahwm; 12.01.2017
comment
как это работает?, где вы говорите, к какой панели обновлений относятся триггеры - person Angel Q; 31.05.2019
comment
Регистрация кнопки с помощью ScriptManager обрабатывает это. docs.microsoft. com/en-us/dotnet/api/ - person Eugene S.; 31.05.2019

У меня была похожая проблема, но я не хотел обновлять весь репитер, только контент за пределами ретранслятора... так что я сделал следующее:

<сильный>1. Добавьте повторитель

<asp:Repeater ID="productList" runat="server">
  <!-- my repeater -->
<asp:Repeater>

<сильный>2. Добавьте панель обновлений с обновляемым содержимым и триггер

<asp:UpdatePanel ID="up" runat="server">
    <ContentTemplate>
        <!-- when click on repeater's links, this content will be updated -->
    </ContentTemplate>
    <Triggers>
        <!-- trigger will be the repeater's links/btn that generate postback -->
        <asp:AsyncPostBackTrigger ControlID="productList" />
    </Triggers>
</asp:UpdatePanel>
person Jaider    schedule 26.03.2014
comment
Большое спасибо, что поделились этим! Именно то, что я пытался сделать :-) - person Oliver; 05.04.2014
comment
Спасибо за это. Я никогда не знал, что можно ссылаться на весь повторитель как на триггер. - person johna; 18.10.2018

Также будет работать добавление следующего атрибута в директиву страницы, содержащую повторитель и кнопку ссылки:

<%@ page ClientIDMode="AutoID" %>

У меня был элемент управления, который должен был работать как асинхронно, так и с полной обратной передачей, поэтому использование ScriptManager.RegisterAsyncPostBackControl для меня не сработало. Включив элемент управления (который содержал повторитель и кнопку ссылки) внутри UpdatePanel, кнопка ссылки вызвала бы асинхронную обратную передачу. Без панели обновлений кнопка ссылки вызовет полный постбэк.

Надеюсь, это поможет кому-то другому.

person Matt F    schedule 12.04.2012