【问题标题】:ScriptManager duplicates javascriptScriptManager 复制 javascript
【发布时间】:2010-05-28 10:37:51
【问题描述】:

我有一个用户控件,例如可以在 gridview 项目模板中使用,这意味着该控件可能会或可能不会在页面加载时出现在页面上。如果控件位于 itemtemplate 中,我将通过异步回发(通过更新面板)弹出 gridview。

控件本身是注册器脚本块,因为它依赖于 javascripts。首先我用了

Page.ClientScript.RegistrerClientScriptBlock

但这不适用于异步回发(更新面板),因此我随后尝试使用 ScriptManager 进行相同操作,它允许我在异步回发后在页面上注册脚本。伟大的!。

ScriptManager.RegisterClientScriptBlock

但是,ScriptManager(我所知道的)没有查看脚本是否已经在页面上的功能,所以我会为每次回发生成脚本块的副本,这当然是不受欢迎的行为。

我在 Google 上进行了一次运行,发现我可以调用 PageRequestManager 的 Dispose() 方法,这确实有效,因为它会清除脚本然后再次添加它们(这也解决了我删除未使用脚本的问题已移除控件的块)。

Sys.WebForms.PageRequestManager.getInstance().Dispose()

但是,自从我在这里发帖以来,当然有一个缺点:)。 Dispose() 方法也会在母版页上处理实例,这会导致在那里运行的脚本将在异步回发后停止运行(例如 updateprogress)。

那么,有没有办法使用 ScriptManager 或任何其他工具检查页面上是否已经存在脚本,这会阻止我插入重复的脚本?另外,有没有办法删除某些脚本块(例如,当我删除 itemtemplate 中的项目时)。

非常感谢。

【问题讨论】:

    标签: javascript asp.net-ajax updatepanel scriptmanager


    【解决方案1】:

    试试这样的功能:

    Public Sub AddScriptToCompositeScriptSafety(ByRef manager As ScriptManager, ByRef script As ScriptReference)
    
        For Each item In manager.CompositeScript.Scripts
            If (item.Path = script.Path) Then
                Return
            End If
        Next
        manager.CompositeScript.Scripts.Add(script)
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      如果你在注册的时候设置了相同的type和key属性,那么我认为SM只会包含其中一个。

      【讨论】:

      • 嗯,实际上您似乎是对的。当我深入研究它时,我实际上意识到我使用 Page 而不是 usercontrol 来注册错误第一的脚本。错误二是我在我的脚本中包含了一个 add_endRequest,其目的是处理异步回发,但这不是必需的,因为 ScripManager 似乎为我做了这个,因此重复调用。不过感谢您的回答:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      相关资源
      最近更新 更多