2011-04-11 83 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事件,它將起作用。爲什麼?我不知道。但是,它的工作。您的設計可能看起來不太好,但會觸發您希望的異步回傳。