【问题标题】:Injecting javascript from a user control inside an UpdatePanel从 UpdatePanel 内的用户控件注入 javascript
【发布时间】:2012-10-16 15:10:43
【问题描述】:

当页面最初呈现时,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 上的元素服务器代码中的父页面。

提前致谢。

附:我知道UpdatePanels 很糟糕,应该不惜一切代价避免使用,但我正在处理数百个已经在使用它们并且无法更改的消费页面。

【问题讨论】:

    标签: javascript asp.net vb.net user-controls updatepanel


    【解决方案1】:

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

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

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

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

    ASP.Net - Javascript inside AJAX UpdatePanel

    【讨论】:

    • 我从您的其他答案中获得了该功能 - 在更新面板的部分回发时,它似乎调用了两次 initializeControl 功能 - 有什么想法吗?
    • 我从函数中删除了scriptText = String.Concat("Sys.Application.add_load(function(){", scriptText, "});"),它似乎运行良好,谢谢!
    • @jbabey 好东西。是的,我的回答是,如果您只是要单独使用它。链接的问题/答案是一个完整的解决方案,不需要您添加 add_load 调用,因为代码会为您完成。
    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多