异步处理重复器事件
本文关键字:事件 处理 异步 | 更新日期: 2023-09-27 17:49:36
在我的页面(asp.net)上有一个自定义搜索控件,它包含一个文本框和一个用于显示结果的重复器。
中继器在用户键入…漂亮而简单的回调。
…
当选择搜索结果时,中继器触发回发并引发itemcommand事件(如预期的那样)…这个事件为自己添加了一个子重复器,并将一个子列表绑定到当前项。
我的问题是,我不希望我的父中继器启动一个完整的回发,因为页面渲染相当耗时。我试着把控件/只是外部中继器在一个ajax更新面板控件,但它似乎仍然触发一个完整的回发。
有谁能告诉我如何告诉一个重复器在回调中而不是回发中触发它的item命令事件?
我猜这涉及到我的重复器项目控制的手动接线负荷,但我希望有一个控制的地方,处理所有这些为我:)
编辑:我的情况示例....
<asp:UpdatePanel ... >
<asp:Repeater ...>
<itemTemplate> <asp:LinkButton ... CommandArg='<%= Eval("ID") %>' CommandName="select" /> </itemTemplate>
</asp:Repeater>
</asp:UpdatePanel>
我的问题是…
如何告诉中继器"fire this link buttons onclick作为回调而不是回发"
在更新面板中包装中继器的过程没有帮助,因为链接按钮的ID是动态的,因此我不能(无论如何不是内联的)为链接按钮添加触发器。
如果我手动添加一个触发器面板在中继器的onitembound事件我得到一个异常从。net说回调引用是无效的…我想这是因为我试图将回调触发器附加到已经处理回发事件或由中继器设置的控件上…
编辑2:这里面临的场景示例
本质上是因为这个控制X次在页面上实际上所有东西都必须是动态的。控件实现了ICallbackHandler,当用户输入公司名称时,搜索代码(不包括在下面)会触发一个ajax调用onkeyup(所以它的工作方式有点像google)。
我希望当用户从列表中单击公司名称时,它会ajax回调/部分回发以恢复分支的子列表,从而防止完整的页面闪烁,您获得完整的回发。
然后用户将选择一个分支,它将执行一个完整的回发,这将导致多个服务器操作发生。
This works fine as is…这不是最干净的用户体验。
<div id='<%= this.UniqueID + "Results" %>' class="results">
<asp:Repeater ID="ui_lstCompanies" runat="server" onitemcommand="ui_lstCompanies_ItemCommand">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<asp:Panel ID="item" runat="server">
<li>
<asp:LinkButton ID="ui_btnSelectCompany" runat="server" CommandName="Select" Text='<%# Eval("Name") %>' />
</li>
</asp:Panel>
<asp:Panel ID="selectedItem" runat="server" Visible="false">
<li>
<hr /><h4><%# Eval("Name") %></h4>
<asp:Repeater ID="ui_lstBranches" runat="server" onitemcommand="ui_lstBranches_ItemCommand" >
<HeaderTemplate>
<table style="border-collapse:collapse;">
<tr><th> </th><th>Branch Name</th><th>Branch Address</th><th>Tel</th><th>Fax</th><th>Email</th></tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td> </td>
<td><asp:LinkButton ID="ui_btnSelectBranch1" runat="server" CommandArgument='<%# Eval("ID") %>' CommandName="Select" Text='<%# Eval("Name") %>' /></td>
<td><asp:LinkButton ID="ui_btnSelectBranch2" runat="server" CommandArgument='<%# Eval("ID") %>' CommandName="Select" Text='<%# Eval("Address") %>' /></td></td>
<td><asp:LinkButton ID="ui_btnSelectBranch3" runat="server" CommandArgument='<%# Eval("ID") %>' CommandName="Select" Text='<%# Eval("Telephone1") %>' /></td></td>
<td><asp:LinkButton ID="ui_btnSelectBranch4" runat="server" CommandArgument='<%# Eval("ID") %>' CommandName="Select" Text='<%# Eval("Fax") %>' /></td></td>
<td><asp:LinkButton ID="ui_btnSelectBranch5" runat="server" CommandArgument='<%# Eval("ID") %>' CommandName="Select" Text='<%# Eval("Email") %>' /></td></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<hr />
</li>
</asp:Panel>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</div>
我也遇到过类似的问题。如果您将链接按钮替换为常规asp:按钮,并继续使用重复器的itemcommand事件,它将工作。为什么?我不知道。然而,它是有效的。它可能不适合您的设计,但它会触发您想要的异步回发。
<asp:Repeater runat="server" ID="rpt1">
</asp:Repeater>
<asp:UpdatePanel runat="server" ID="up1">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="rpt1"/>
</Triggers>
<ContentTemplate>
<asp:Repeater runat="server" ID="rpt2">
</asp:Repeater>
</ContentTemplate>
</asp:UpdatePanel>
这应该执行异步调用所有命令从rpt1。把这些中继器控制换成你的
编辑:我基本上创建了一个模型,你的代码与不同的领域等。我假设下面的代码是你尝试过的,它不起作用?如果是这样的话,我不知道为什么它在你这边不起作用,而在我这边,一定有一些细微的差异,我们没有注意到。
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel runat="server" ID="UpdatePanel1">
<ContentTemplate>
<div id='<%= this.UniqueID + "Results" %>' class="results">
<asp:Repeater ID="ui_lstCompanies" runat="server" OnItemCommand="ui_lstCompanies_ItemCommand">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<asp:Panel ID="item" runat="server">
<li>
<asp:LinkButton ID="ui_btnSelectCompany" runat="server" CommandName="Select" Text='<%# Eval("Name") %>' />
</li>
</asp:Panel>
<asp:Panel ID="selectedItem" runat="server" Visible="false">
<li>
<hr />
<h4>
<%# Eval("Name") %></h4>
<asp:Repeater ID="ui_lstBranches" runat="server" OnItemCommand="ui_lstBranches_ItemCommand">
<HeaderTemplate>
<table style="border-collapse: collapse;">
<tr>
<th>
</th>
<th>
Branch Name
</th>
<th>
Branch Address
</th>
<th>
Tel
</th>
<th>
Fax
</th>
<th>
Email
</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
</td>
<td>
<asp:LinkButton ID="ui_btnSelectBranch1" runat="server" CommandArgument='<%# Eval("ID") %>'
CommandName="Select" Text='<%# Eval("Name") %>' />
</td>
<td>
<asp:LinkButton ID="ui_btnSelectBranch2" runat="server" CommandArgument='<%# Eval("ID") %>'
CommandName="Select" Text='<%# Eval("Address") %>' />
</td>
</td>
<td>
<asp:LinkButton ID="ui_btnSelectBranch3" runat="server" CommandArgument='<%# Eval("ID") %>'
CommandName="Select" Text='<%# Eval("Telephone1") %>' />
</td>
</td>
<td>
<asp:LinkButton ID="ui_btnSelectBranch4" runat="server" CommandArgument='<%# Eval("ID") %>'
CommandName="Select" Text='<%# Eval("Fax") %>' />
</td>
</td>
<td>
<asp:LinkButton ID="ui_btnSelectBranch5" runat="server" CommandArgument='<%# Eval("ID") %>'
CommandName="Select" Text='<%# Eval("Email") %>' />
</td>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<hr />
</li>
</asp:Panel>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</div>
</ContentTemplate>
</asp:UpdatePanel>