当页面最初呈现时,会调用initializeControl
函数,一切正常。
当页面执行完整的postback(通过提交按钮)时,还会调用initializeControl
函数,一切正常。
然而,当UpdatePanel
有部分后置时,initializeControl
函数永远不会被调用,控件也会停止工作。
HTML:
<asp:ScriptManager ID="myScriptManager" runat="server" />
<asp:UpdatePanel ID="myUpdatePanel" runat="server">
<ContentTemplate>
<uc:MyControl ID="myControl" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
用户控制:
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
Dim initializeScript = String.Format("initializeControl('{0}');", ClientID)
Page.ClientScript.RegisterStartupScript(GetType(Page),
New Guid().ToString(), initializeScript, True)
MyBase.Render(writer)
End Sub
出于测试目的,假设initializeControl
函数只是一个debugger;
(函数的内容运行良好——只是在需要的时候没有被调用)。
请记住,(据我所知)用户控件无法知道它是否在UpdatePanel
中,也无法访问服务器代码中父页上的ScriptManager
元素。
提前谢谢。
附言:我知道UpdatePanel
很糟糕,应该不惜一切代价避免,但我正在处理数百个已经在使用它们的消费页面,它们无法更改。
这很可能是由于页面更新是通过更新面板进行的。在这些情况下,启动脚本可能会出现不启动的问题,并且需要封装在:中
Sys.Application.add_load(function(){ myFunctionCall(); });
这是微软AJAX库确保启动脚本在微软AJAX往返过程中发生的方式。
这里有一种简单的方法可以确保添加到页面的所有客户端脚本都能工作,无论它们是否包含在ajax更新面板中。我们在所有的项目中都使用了这一点,它完美地工作:
ASP.Net-AJAX UpdatePanel 中的Javascript