当页面最初呈现时,调用initializeControl
函数并且一切正常。
当页面执行完整的回发后(通过提交按钮),也会调用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
内,并且也无法访问{{1服务器代码中父页面上的元素。
提前致谢。
P.S。我知道ScriptManager
很糟糕,应该不惜一切代价避免,但我正在使用已经使用它们的数百个消费页面而且它们无法更改。
答案 0 :(得分:2)
这很可能是因为页面更新是通过更新面板进行的。在这些情况下,启动脚本可能存在未触发的问题,需要包装在:
Sys.Application.add_load(function(){ myFunctionCall(); });
这是Microsoft AJAX库确保启动脚本在MS AJAX往返过程中发生的方式。
这是一种简单的方法,可以确保添加到页面的所有客户端脚本都能正常工作,无论它们是否包含在ajax updatepanel中。我们在所有项目中都使用它,它可以完美地运行: