Я страдаю от событий, потерянных после частичной обратной передачи в пользовательском элементе управления на панели обновлений. Я много раз искал решение для этого и нашел множество решений для событий 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 на панели обновления, поскольку это повлияет на поведение других компонентов.
- Логика события щелчка ссылки должна быть на стороне сервера.
У кого-нибудь есть предложения, которые я мог бы попытаться повторно связать событиями кликов?
Я ценю помощь!