页面最初呈现时,将调用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内,也无法访问父页面上的ScriptManager元素在服务器代码中。

提前致谢。

附言我知道UpdatePanel很糟糕,应该不惜一切代价避免使用,但是我正在使用数百个正在使用它们的消耗性页面,因此无法更改它们。

最佳答案

这很可能是由于页面更新是通过更新面板进行的。在这些情况下,启动脚本可能会出现无法启动的问题,因此需要将其包装在:

Sys.Application.add_load(function(){ myFunctionCall(); });


这是Microsoft AJAX库确保您的启动脚本在MS AJAX往返期间应发生的方式。

这是一种确保所有添加到页面的客户端脚本都能正常工作的简便方法,无论它们是否包含在ajax updatepanel中。我们在所有项目中都使用了它,并且可以完美地工作:

ASP.Net - Javascript inside AJAX UpdatePanel

关于javascript - 从UpdatePanel内部的用户控件注入(inject)javascript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12917821/

10-13 01:45