异步处理转发器事件

时间:2011-04-11 12:08:24

标签: c# asp.net repeater asynccallback

我的页面上有一个自定义搜索控件(asp.net),其中包含一个文本框和一个用于显示结果的转发器。

当用户键入...简单回调时,转发器将填充回调。

...

当选择搜索结果时,转发器会触发回发并引发itemcommand事件(如预期的那样)......此事件会向自身添加子转发器并将子列表绑定到当前项目。

我的问题是我不希望我的父转发器触发完整的回发,因为该页面渲染非常耗时。 我尝试将控件/外部转发器放入ajax更新面板控件,但它似乎仍然会发出一个完整的回发。

任何人都可以告诉我如何告诉转发器在回调而不是回发中触发其项目命令事件?

我猜这涉及到我的转发器项目控件的手动接线负载,但我希望有一个控件可以处理所有这些对我:)

编辑:我的情况样本......

<asp:UpdatePanel ... >
  <asp:Repeater ...>
    <itemTemplate> <asp:LinkButton ... CommandArg='<%= Eval("ID") %>' CommandName="select" /> </itemTemplate>
  </asp:Repeater>
</asp:UpdatePanel>

所以我的问题是......

我如何告诉转发器“触发此链接按钮onclick作为回调而不是回发”

在更新面板中包装转发器的过程没有帮助,因为链接按钮的ID是动态的,因此我不能(无论如何都内联)为链接按钮添加触发器。

如果我在转发器onitembound事件中手动添加一个触发器,我会从.Net得到一个例外,他说回调参考无效...我想这是因为我试图将一个回调触发器附加到一个控件上已经处理回发事件或由转发器设置的东西......

编辑2:这里面临的情景样本

主要是因为这个控件在页面上的次数几乎一切都必须是动态的。 该控件实现了ICallbackHandler,当用户输入公司名称时,搜索bx代码(下面未包含)会触发ajax调用onkeyup(所以它的工作方式有点像google)。

我希望当用户从列表中点击公司名称时,它会回调/部分回发以恢复分支的子列表,从而防止整个回发时出现整页闪烁。

然后,用户将选择一个分支,它将执行完整的回发,这将导致发生多个服务器操作。

这样可以正常工作......它不是最干净的用户体验。

<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>&nbsp;</th><th>Branch Name</th><th>Branch Address</th><th>Tel</th><th>Fax</th><th>Email</th></tr>
                    </HeaderTemplate>
                    <ItemTemplate>   
                            <tr>
                                <td>&nbsp;&nbsp;&nbsp;</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>

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题。如果您使用常规的asp:按钮替换链接按钮并继续使用转发器的itemcommand事件,它将起作用。为什么?我不知道。但是,它的工作原理。它可能不适合您的设计,但它会触发您想要的异步回发。

答案 1 :(得分:1)

 <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的所有命令执行异步调用。 只需用你的替换这些转发器控件

修改

我基本上已经创建了一个包含不同字段的代码的模型等。我假设下面的代码是你尝试过的,但它不起作用?如果是这样,那么我就不知道为什么它不能在你身边工作,因为它是在myne上,在我们没有接受的地方肯定会有一些细微的差别。

<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>
                                                &nbsp;
                                            </th>
                                            <th>
                                                Branch Name
                                            </th>
                                            <th>
                                                Branch Address
                                            </th>
                                            <th>
                                                Tel
                                            </th>
                                            <th>
                                                Fax
                                            </th>
                                            <th>
                                                Email
                                            </th>
                                        </tr>
                                </HeaderTemplate>
                                <ItemTemplate>
                                    <tr>
                                        <td>
                                            &nbsp;&nbsp;&nbsp;
                                        </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>