2011-05-17 42 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时防止混乱