ScriptManager复制javascript

ScriptManager复制javascript,javascript,asp.net-ajax,updatepanel,scriptmanager,Javascript,Asp.net Ajax,Updatepanel,Scriptmanager,我有一个usercontrol,可以在gridview itemtemplate中使用,这意味着在页面加载时该控件可能在页面上,也可能不在页面上。在控件位于itemtemplate中的情况下,我将通过异步回发(通过UpdatePanel)弹出gridview 由于控件本身依赖于javascripts,因此它会注册ScriptBlock。首先我用 Page.ClientScript.RegistrerClientScriptBlock 但这在异步回发(UpdatePanel)上不起作用,因此我使

我有一个usercontrol,可以在gridview itemtemplate中使用,这意味着在页面加载时该控件可能在页面上,也可能不在页面上。在控件位于itemtemplate中的情况下,我将通过异步回发(通过UpdatePanel)弹出gridview

由于控件本身依赖于javascripts,因此它会注册ScriptBlock。首先我用

Page.ClientScript.RegistrerClientScriptBlock
但这在异步回发(UpdatePanel)上不起作用,因此我使用ScriptManager尝试了同样的方法,它允许我在异步回发后在页面上注册脚本。太好了

ScriptManager.RegisterClientScriptBlock
然而,ScriptManager(据我所知)不具备查看脚本是否已经在页面上的功能,因此我将为每次回发生成脚本块的副本,这当然是不必要的行为

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

然而,当然也有一个缺点,因为我在这里张贴:)。 Dispose()方法也处理母版页上的实例,这会导致在那里运行的脚本在异步回发后停止运行(例如updateprogress)

那么,是否有一种方法可以使用ScriptManager或任何其他工具检查页面上是否已经存在脚本,从而防止我插入重复的脚本?另外,是否有方法删除某些脚本块(例如,当我删除itemtemplate中的项目时)


提前非常感谢。

如果您在注册时设置了相同的类型和密钥属性,那么我认为SM将只包括其中一个。

尝试以下功能:

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

嗯,看起来你是对的。当我深入研究它时,我实际上意识到我使用了页面而不是用户控件来注册脚本,这是第一个错误。第二个错误是,我在脚本中包含了一个add_endRequest,其目的是处理异步回发,但这不是必需的,因为ScripManager似乎为我做了这件事,因此重复调用。谢谢你的回答:)
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