UpdatePanel и потерянные события - ASP.NET - PullRequest
2 голосов
/ 02 марта 2012

Я страдаю от событий, потерянных после частичной обратной передачи в пользовательском элементе управления на панели обновлений. Я много раз искал решение для этого и нашел множество решений для событий jquery и реализаций AsyncPostBackTriggers, но предложенные исправления не относятся к моему случаю или не сработали.

Мой сценарий следующий:

У меня есть PageContainer.ascx, который содержит панель обновления

<asp:UpdatePanel ID="updatePanel_1" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
etc..

UpdatePanel_1 имеет в качестве внуков внутри других пользовательских элементов управления, включая Links.ascx :

<asp:Panel ID="pnlLinksBody" runat="server" class="PRD_BC_box">
   <asp:Repeater ID="repLinks" runat="server" onitemdatabound=" repLinks_ItemDataBound>
        <HeaderTemplate>
              (...)
        </HeaderTemplate>
            <ItemTemplate>
                <tr>
                <td>
                <asp:LinkButton ID="lnkNumber" runat="server" CssClass="linkMedium NumberLink" OnClick="lnkNumber_OnClick">
                </asp:LinkButton>
                 </td>                        
                 <td>
            </ItemTemplate>
     </asp:Repeater>
</asp:Panel>

И мой Links.ascx.cs имеет следующее:

protected void repLinks_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    var citationRepeater = item.FindControl("repLinks") as Repeater;
    var citations = getCitations();

    if ((citationRepeater != null) && (citations.Count > 0))
    {
        citationRepeater.DataSource = citations;
        citationRepeater.DataBind();
    }
}

protected void lnkNumber_OnClick(object sender, EventArgs e)
{
     //Server code that needs to be executed
}

Поэтому, когда я впервые загружаю элемент управления Links, происходит привязка данных, и каждый lnkNumber получает обработчик щелчка, назначенный в соответствии с определением в шаблоне. После щелчка по нему происходит постбэк, и событие lnkNumber_OnClick запускается правильно. Однако при втором щелчке по нему событие никогда не запускается.

Я понимаю, что Панели обновления и их частичные постбэки переписывают код, и события должны быть заново подключены, чтобы работать снова, однако, похоже, ничего из того, что я пробовал, не работает.

Я пробовал:

  • Из Links.ascx.cs получите прародитель UpdatePanel из PageContainer и добавьте в него AsyncPostBackTrigger с CliendId = pnlLinksBody. (невозможно добавить триггер для каждой LinkButton, поскольку их идентификатор генерируется автоматически во время привязки данных)
  • Изменение свойств LinkButtons - useSubmitBehavior true / false
  • Вызов updatePanel_1.Update () после каждого постбэка.

А также

  • Загрузка элемента управления firstLinks происходит во время постбэка, делая что-то вроде "if (! IsPostBack) DataBind ();" не будет работать, чтобы предотвратить повторные привязки.
  • Невозможно изменить свойства updateMode и childrenAsTriggers на панели обновления, поскольку это повлияет на поведение других компонентов.
  • Логика события щелчка ссылки должна быть на стороне сервера.

У кого-нибудь есть предложения, которые я мог бы попытаться повторно связать событиями кликов?

Я ценю помощь!

...