2011-05-17 91 views
8

我有一個由3個用戶控件(ascx)組成的aspx頁面。我有一個更新面板包裹3個的用戶控制是這樣的:每次刷新時從更新面板執行javascript

<asp:UpdatePanel ID="UpdatePanelWrapper" runat="server"> 
    <ContentTemplate> 
     <uc1:UserControl1 ID="UserControl1" runat="server" />   
     <uc2:UserControl2 ID="UserControl2" runat="server"/> 
     <uc2:UserControl3 ID="UserControl3" runat="server"/> 
    </ContentTemplate> 
</asp:UpdatePanel> 

我示出了通過單獨的各個用戶的控制,所以,當顯示「的UserControl1」,其他的2個用戶控件被隱藏。

「UserControl1」內部我有一些asp控件和一些javascript函數。我的問題是,當「UpdatePanelWrapper」刷新時,這些javascript函數從不會被調用。

我試過這個解決方案http://blog.dreamlabsolutions.com/post/2009/02/24/jQuery-document-ready-and-ASP-NET-Ajax-asynchronous-postback.aspx,通過在「UserControl1」中添加javascript調用,雖然它不起作用。我只是在aspx頁面中添加javascript調用時才工作,但不在「UserControl1」中。

任何幫助將不勝感激,謝謝。

回答

11

這裏是你如何能做到這一點....這是在響應的UpdatePanel返回

<script type="text/javascript"> 

     Sys.Application.add_init(appl_init); 

     function appl_init() { 
      var pgRegMgr = Sys.WebForms.PageRequestManager.getInstance(); 
      pgRegMgr.add_endRequest(EndHandler); 
     } 

     function EndHandler() { 
     // This will be called whenever your updatepanel update 
     // It will be trigger after the update updatepanel 
     //add your javascript here 
     }               
    </script> 
+0

謝謝,這是我的工作方式。由於我在同一個頁面中使用了幾個UC,我只是在.aspx文件中添加了代碼,所以我可以從「EndHandler」方法中調用任何js方法。 – Fer 2011-07-21 19:44:51

+0

偉大的解決方案,穆罕默德!我建議的唯一改進就是改爲自定義事件觸發。這樣,可以創建和使用多個處理程序,而無需更改「基本」腳本,重新執行與「基本」中相同的預訂,或覆蓋「EndHandler」。 – 2014-02-10 15:17:21

0

理想情況下,您的所有JavaScript應該在關閉</body>標記之前的頁面底部。

如果您正在使用jQuery,你需要使用live()delegate(),以確保這些事件處理程序泡漲,即使在頁面得到刷新。

1

可以使用

Sys.Application.add_load(WireEvents); //爲.NET AJAX的UpdatePanel

修復佈線像

<script language="javascript" type="text/javascript"> 
// <![CDATA[ 
    Sys.Application.add_load(WireEvents); // fix wiring for .NET ajax updatepanel 
    $(WireEvents); // handle page load wiring using jquery. This will fire on page load 


    function WireEvents() { 
       //do stuff here 
    }; 
// ]]> 
</script> 

哦還有一兩件事。請注意功能名稱。否則會很混亂。 嘗試這樣的事情

<script language="javascript" type="text/javascript"> 
// <![CDATA[ 
    Sys.Application.add_load(WireEvents_<%=this.ID%>); // fix wiring for .NET ajax updatepanel 
    $(WireEvents_<%=this.ID%>); // handle page load wiring 


    function WireEvents_<%=this.ID%>() { 

    };// end WireEvents_ 


// ]]> 
</script> 

所以基本上增加_<%=this.ID%>的功能可按名稱確保控制的每一個實例是調用它自己的功能。假設你可以有多個控件實例。如果不是至少需要不同的控制wireevents時防止混亂