2011-04-11 118 views
0

我在我的页面(asp.net)上有一个自定义搜索控件,它包含一个文本框和一个用于显示结果的中继器。异步处理中继器事件

随着用户键入...回复很好,简单的回调中继器填充回调。

...

当搜索结果中选择中继打完回传和ItemCommand事件引发(如预期)...并且该事件将子中继器本身并绑定一个子列表到当前项目。

我的问题是,我不希望我的父母转发器发射完整的回发,因为该页面是非常耗时渲染。 我试图把控制/只是外部中继器到ajax更新面板控制,但它似乎仍然发射回发。

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

我猜这涉及手工布线的负载为我的repeater项目管制,但我希望那里有一个地方的控制,处理一切对我来说:)

编辑:样品我的情况... 。

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

所以我的问题是...

我如何告诉中继“火这个链接按钮的onclick的回调,而不是回传”

由于链接按钮的ID是动态的,因此我无法(不内联)为链接按钮添加一个触发器,因此在更新面板中封装中继器的过程不起作用。

如果我手动添加触发器到中继器onitembound事件的面板我从.Net得到一个异常说他回调引用是无效的......我想这是因为即时尝试附加回调触发器到控件已在处理由中继回发事件或一些设置...

编辑2:这里

主要是因为在页面上的时候,这控制X数量几乎一切都必须面对的动态场景的样品。 控件实现ICallbackHandler和搜索bx代码(不包括在下面)在用户输入公司名称时触发ajax调用onkeyup(所以它的工作原理有点像谷歌)。

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

然后用户会选择一个分支,它会做一个完整的回发,这将导致发生几个服务器动作。

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

<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> 
+0

您是否尝试将父Repeater控件设置为子控件上的更新面板的异步触发器? – 2011-04-11 12:14:22

+0

我认为这个问题是因为中继器项目模板的工作方式... 我需要使得执行回调而不是回传。 – War 2011-04-11 13:12:16

回答

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

编辑:

我已经基本上建立与不同领域等你的代码的样机我认为下面的代码是什么,你尝试和它不工作?如果是这样,那么我不知道为什么它不在你身边,因为它在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> 
+0

其外部中继器回发我想处理不内在的。内部中继器可以正常回发。 – War 2011-04-11 13:10:54

+0

也可能值得注意的是,第二个中继器位于仅在选择该项目时出现的面板中。尝试上述方法似乎并不奏效。无论是作为中继器渲染项目模板控件与像onclick =“__ doPostback(...)”等东西,并将其包装在更新面板中,这似乎没有帮助。 – War 2011-04-12 07:38:37

+0

最后我不能打扰它,所以我决定忍受延迟,并让页面呈现“加载”,而它做的事情...不理想,但现在解决了这个问题。 Thx虽然帮助。 – War 2011-04-12 07:40:03

2

我遇到了类似的问题。如果你用常规的asp:button替换链接按钮,并继续按原样使用中继器的itemcommand事件,它将起作用。为什么?我不知道。但是,它的工作。您的设计可能看起来不太好,但会触发您希望的异步回传。