2010-05-25 22 views
7

Hi tôi cần phải đánh chặn máy chủ gọi lại sau khi bảng điều khiển udate async bài trở lại và xác định bảng bắt đầu yêu cầu. Mã này khá đơn giản:Làm thế nào để có được id của Updatepanel mà bắt đầu một postback

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(InterceptUpdateCallback); 

function InterceptUpdateCallback(sender, args) 
{ 
    var updatedPanels = args.get_panelsUpdated();  
    for (idx = 0; idx < updatedPanels.length; idx++) { 
     if (updatedPanels[idx].id == "myUpdatePanel") {    
      StartSmth(); 
      break; 
     } 
     } 
} 

Và nó hoạt động khi UpdatePanel không nằm trong UpdatePanel khác. Nhưng khi nó nằm trong UpdatePanel UpdatePanels khác [idx] .id có id Updatepanel cha. Vì vậy, làm thế nào tôi có thể nhận được id của UpdatePanel mà bắt đầu yêu cầu (UpdatePanel bên trong)? Thanx

Trả lời

2

Ở đây bạn đi:

function InterceptUpdateCallback(sender, args) { 
if (sender._postBackSettings) 
    alert(sender._postBackSettings.panelID); 
else 
    alert('first load');  
} 

Cập nhật:

<%@ Page Language="C#" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<script runat="server"> 
    protected void LinkButtons_Click(object sender, EventArgs e) 
    { 
     LabelMain.Text = LabelSub1.Text = LabelSub2.Text = LabelSub3.Text = string.Format("{0} Updated By {1}", DateTime.Now, ((Control)sender).ID); 
    } 
</script> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <style type="text/css"> 
     body { font-family: Tahoma;} 
     fieldset { padding: 15px; } 
     fieldset a 
     { 
      float: right; 
      clear: none; 
      display: block; 
      margin: 10px; 
     } 
     fieldset span 
     { 
      display: block; 
      margin-top: 20px; 
      margin-bottom: 20px; 
     } 
    </style> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server" /> 
    <script type="text/javascript"> 
     function pageLoaded(sender, args) { 
      if (sender._postBackSettings) { 
       var panelId = sender._postBackSettings.panelID.split('|')[0]; 
       if (panelId == sender._scriptManagerID) { 
        var updatedPanels = args.get_panelsUpdated(); 
        var affectedPanels = "Affected Panels:\n"; 
        for(var x=0;x<updatedPanels.length;x++) 
         affectedPanels+= updatedPanels[x].id + "\n"; 
        alert("Request initiated by ScriptManager\n\nMight be an async trigger, or child of an update panel with children as triggers set to false.\n\n"+affectedPanels); 
       } 
       else 
        alert("Request initiated by: " + panelId); 
      } 
     } 
     Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoaded); 
    </script> 

    <asp:LinkButton ID="UpdateMain" runat="server" Text="UpdateMain" OnClick="LinkButtons_Click"></asp:LinkButton>, 
    <asp:LinkButton ID="UpdateSub1" runat="server" Text="UpdateSub1" OnClick="LinkButtons_Click"></asp:LinkButton>, 
    <asp:LinkButton ID="UpdateSub2" runat="server" Text="UpdateSub2" OnClick="LinkButtons_Click"></asp:LinkButton>, 
    <asp:LinkButton ID="UpdateSub3" runat="server" Text="UpdateSub3" OnClick="LinkButtons_Click"></asp:LinkButton> 
    <br /> 
    <br /> 
    <asp:UpdatePanel ID="Main" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <fieldset> 
       <asp:LinkButton ID="LinkButton1" runat="server" Text="LinkButton1" OnClick="LinkButtons_Click"></asp:LinkButton> 
       <legend>Main - Update Mode:Conditional, Children As Triggers:False</legend> 
       <asp:Label ID="LabelMain" runat="server" Text="LabelMain"></asp:Label> 
       <asp:UpdatePanel ID="Sub1" runat="server" UpdateMode="Always" ChildrenAsTriggers="true"> 
        <ContentTemplate> 
         <fieldset> 
          <asp:LinkButton ID="LinkButton2" runat="server" Text="LinkButton2" OnClick="LinkButtons_Click"></asp:LinkButton> 
          <legend>Sub1 - Update Mode:Always, Children As Triggers:True</legend> 
          <asp:Label ID="LabelSub1" runat="server" Text="LabelSub1"></asp:Label> 
          <asp:UpdatePanel ID="Sub2" runat="server" UpdateMode="Always" ChildrenAsTriggers="true"> 
           <ContentTemplate> 
            <fieldset> 
             <asp:LinkButton ID="LinkButton3" runat="server" Text="LinkButton3" OnClick="LinkButtons_Click"></asp:LinkButton> 
             <legend>Sub2 - Update Mode:Always, Children As Triggers:True</legend> 
             <asp:Label ID="LabelSub2" runat="server" Text="LabelSub2"></asp:Label> 
            </fieldset> 
           </ContentTemplate> 
           <Triggers> 
            <asp:AsyncPostBackTrigger ControlID="UpdateSub2" /> 
           </Triggers> 
          </asp:UpdatePanel>        
         </fieldset>       
        </ContentTemplate> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="UpdateSub1" /> 
        </Triggers> 
       </asp:UpdatePanel> 
       <asp:UpdatePanel ID="Sub3" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
        <ContentTemplate> 

         <fieldset> 
          <asp:LinkButton ID="LinkButton4" runat="server" Text="LinkButton4" OnClick="LinkButtons_Click"></asp:LinkButton> 
          <legend>Sub3 - Update Mode:Conditional, Children As Triggers:False</legend> 
          <asp:Label ID="LabelSub3" runat="server" Text="LabelSub3"></asp:Label> 
         </fieldset>       
        </ContentTemplate> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="UpdateSub3" /> 
        </Triggers> 
       </asp:UpdatePanel> 
      </fieldset> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="UpdateMain" /> 
     </Triggers> 
    </asp:UpdatePanel> 
    </form> 
</body> 
</html> 
+0

Tôi nghi ngờ nó sẽ hoạt động vì _postBackSettings là thuộc tính nội bộ nên bạn không thể gọi trực tiếp từ mã của mình. – Voice

+0

đây là javascript !! và nó sẽ cung cấp cho bạn id bảng cập nhật và id phần tử kích hoạt như thế này "UpdatePanel1 | Button1". Bạn đã thử chưa? –

+0

Có Tôi đã cố gắng và xảy ra lỗi vì người gửi._postBackSettings không sẵn có – Voice

0

Tôi sẽ đoán trước điều này.

Có thiết lập UpdateMode = Conditional ở bên ngoài (hoặc cả hai) UpdatePanel s trợ giúp? Tôi nghĩ rằng vấn đề là bạn chỉ nhận được bảng điều khiển cập nhật "ngoài cùng" và nếu bạn không đặt UpdateMode thành Conditional bảng điều khiển bên ngoài cũng được cập nhật (ngay cả khi bạn nhấp vào nội dung nào đó trong bảng điều khiển bên trong; xem tham chiếu thứ hai).

Để tham khảo thấy

Lưu ý rằng, nếu tôi loại bỏ các tài sản UpdateMode = Conditional cho UpdatePanel1 (mẹ), cả hai nhãn sẽ nhận được làm mới.

từ ASP.NET 2.0 AJAX Extensions Update Panel - Nested Update Panel

Khi thiết lập để Luôn luôn, UpdatePanel là cập nhật trên mỗi postback huy động từ bất cứ nơi nào trong trang, vì vậy từ điều khiển bên trong bảng điều khiển, bên trong khác panels hoặc chỉ trên trang.

từ Remember to set UpdatePanel's UpdateMode to Conditional

0

Cuối cùng tôi đã đến giải pháp: vấn đề là tôi đã kiểm soát kích hoạt (Nút) cho UpdatePanel con thực sự nằm ngoài bảng cập nhật này và bên trong phụ huynh UpdatePanel (xin lỗi tôi đã không nhận thấy điều đó). Nếu bạn đặt nút bên trong con UpdatePanel - mọi thứ hoạt động tốt.

+0

Điều đó không giúp ích gì trong tình huống của tôi, nơi tôi cần điều khiển kích hoạt bên ngoài bảng cập nhật và đăng ký dưới dạng trình kích hoạt không đồng bộ thông qua ScriptManager. Trong trường hợp đó 'sender._postBackSettings.panelID' chứa các ID của trình kích hoạt và trình quản lý _script_ chứ không phải các bảng cập nhật. –

Các vấn đề liên quan