Master Page.Page中的RegisterStartupScript不会在ContentPlaceHolder中的异步回发上运行Load()

时间:2012-12-14 16:20:10

标签: javascript asp.net ajax master-pages scriptmanager

使用多个不同的关键字在线搜索后,我无法找到解决问题的方法。

我开始寻找一种方法来弹出一条消息,要求用户在取消之前一分钟更新会话。我决定使用的解决方案是在母版页中运行一个javascript计时器,并在Masterpage.Page_Load()上调用它。这样,每当我的用户从一个页面导航到另一个页面时,他们就会重置计时器。但是,由于用户将使用的许多页面具有updatepanels并异步更新,因此正在使用我正在使用的函数,但是跳过了(根据调试器)。

我正在使用的功能是:

ScriptManager.RegisterStartupScript(main, this.GetType(), "callTimer", "callTimer();", true);

此功能在常规回发或母版页上的异步回发(我通过在母版页的更新面板上进行回发来更新计时器)上运行良好,但是,异步回发将跳过此功能。

我尝试过一些事情,控制母版页中的函数页面或UpdatePanel或子页面中的updatepanel。我已经尝试将此代码放在子页面中,但是当这些更改确实重置了计时器时,它会导致javascriptcode多次运行并且它们会在显示倒计时的标签上进行争夺。

我真的很茫然。我认为一个可能的解决方案是更改startupscript的控件并再次终止在该代码之前运行的所有javascripts。然而,以编程方式搜索终止,取消或停止javascript函数的方法也不会产生有用的结果。

我可以接受的另一个解决方案是在鼠标移动时重置计时器,但由于我正在为IE8设计,除非窗口没有焦点,否则这将不起作用。

2 个答案:

答案 0 :(得分:0)

在部分回发的情况下,你需要通过ScriptManager注入脚本,否则它将不会被重新执行。这是一个实用程序函数(vb.net)来为您处理注入逻辑:

Public Shared Sub InjectScript(ByVal containingPage As Page, ByVal scriptKey As String, ByVal scriptText As String)
    Dim sManager = ScriptManager.GetCurrent(containingPage)

    If sManager IsNot Nothing AndAlso sManager.IsInAsyncPostBack Then
        //the page is being partially-posted back by an Ajax control (e.g. UpdatePanel)
         ScriptManager.RegisterStartupScript(containingPage, GetType(Page), scriptKey, scriptText, True)
    Else
        //standard postback
        containingPage.ClientScript.RegisterStartupScript(GetType(Page), scriptKey, scriptText, True)
    End If
End Sub

答案 1 :(得分:0)

我找到了问题的解决方案:我能够通过将当前date.time作为数字发送到javascript函数来解决这个问题。从那里我将倒计时标签的值设置为date.time。在我的计时器中,如果我发现标签的date.time与函数开始的那个不匹配,它将返回并结束该函数。这意味着只有最新的函数实例才会在任何给定时间保持运行。

相关问题