You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何替换已弃用的System.Web.UI.Page.RegisterStartupScript方法?

问题

维护旧VB.NET WebForm代码时,需要替换已弃用的Page.RegisterStartupScript方法,原代码功能是生成弹窗并关闭页面:

原弃用代码

Public Shared Sub cmnCloseForm(ByRef pgTemp As System.Web.UI.Page, Optional ByVal sMsg$ = "", Optional ByVal sExtraJava$ = "")

    ' Variables
    Dim sJava$

    ' New Variable
    Dim sBld As StringBuilder = New StringBuilder()

    ' Create Java String
    sJava = IIf(sMsg <> "", "alert('" + sMsg + "'); ", "") + _
            IIf(sExtraJava <> "", sExtraJava, "") + _
            "self.close();"

    ' Append Strings
    sBld.Append("<script language='javascript'>")
    sBld.Append(sJava)
    sBld.Append("</script>")

    ' Register String
    pgTemp.RegisterStartupScript("closing", sBld.ToString)

End Sub

改用ScriptManager.RegisterStartupScript后,生成的弹窗出现额外文本,尝试的新代码如下:

尝试的新代码

Public Shared Sub cmnCloseForm(ByRef pgTemp As System.Web.UI.Page, Optional ByVal sMsg$ = "", Optional ByVal sExtraJava$ = "")

    ' Variables
    Dim sJava$

    ' New Variable
    Dim sBld As StringBuilder = New StringBuilder()

    ' Create Java String
    sJava = IIf(sMsg <> "", "alert('" + sMsg + "'); ", "") + _
            IIf(sExtraJava <> "", sExtraJava, "") + _
            "self.close();"

    ' Append Strings
    sBld.Append("<script language='javascript'>")
    sBld.Append(sJava)
    sBld.Append("</script>")

    ' Register String
    Dim page As Page = CType(HttpContext.Current.CurrentHandler, Page)
    ScriptManager.RegisterStartupScript(page, page.GetType(), "closing", sBld.ToString(), True)

End Sub

问题原因

ScriptManager.RegisterStartupScript的最后一个参数addScriptTags设为True时,方法会自动为传入的脚本内容包裹<script>标签。但你的代码中已经手动通过StringBuilder拼接了<script>标签,导致最终输出的HTML出现重复的script标签,从而产生额外文本。

另外,原代码已传入pgTemp参数,无需再通过HttpContext.Current.CurrentHandler获取Page实例,直接使用pgTemp即可。

正确修改方案

有两种可行的修改方式:

方式1:保留手动拼接的Script标签,关闭自动添加

将RegisterStartupScript的最后一个参数改为False,避免重复添加标签:

Public Shared Sub cmnCloseForm(ByRef pgTemp As System.Web.UI.Page, Optional ByVal sMsg$ = "", Optional ByVal sExtraJava$ = "")

    Dim sJava$
    Dim sBld As StringBuilder = New StringBuilder()

    sJava = IIf(sMsg <> "", "alert('" + sMsg + "'); ", "") + _
            IIf(sExtraJava <> "", sExtraJava, "") + _
            "self.close();"

    sBld.Append("<script language='javascript'>")
    sBld.Append(sJava)
    sBld.Append("</script>")

    ' 直接使用传入的pgTemp,最后一个参数设为False
    ScriptManager.RegisterStartupScript(pgTemp, pgTemp.GetType(), "closing", sBld.ToString(), False)

End Sub

方式2:移除手动拼接的标签,让方法自动添加(更推荐)

去掉StringBuilder中的<script>标签,利用方法的addScriptTags=True自动生成,代码更简洁规范:

Public Shared Sub cmnCloseForm(ByRef pgTemp As System.Web.UI.Page, Optional ByVal sMsg$ = "", Optional ByVal sExtraJava$ = "")

    Dim sJava$

    sJava = IIf(sMsg <> "", "alert('" + sMsg + "'); ", "") + _
            IIf(sExtraJava <> "", sExtraJava, "") + _
            "self.close();"

    ' 直接传入纯脚本内容,方法自动添加script标签
    ScriptManager.RegisterStartupScript(pgTemp, pgTemp.GetType(), "closing", sJava, True)

End Sub

额外优化建议

  • 替换过时的IIf为If运算符(VB.NET 2008+支持),类型更安全:
    sJava = If(sMsg <> "", "alert('" + sMsg + "'); ", "") + _
            If(sExtraJava <> "", sExtraJava, "") + _
            "self.close();"
    
  • 脚本中使用'包裹字符串时,若sMsg包含单引号会导致JS语法错误,建议对消息内容进行转义处理:
    Dim escapedMsg = sMsg.Replace("'", "\'")
    sJava = If(sMsg <> "", "alert('" + escapedMsg + "'); ", "") + _
            If(sExtraJava <> "", sExtraJava, "") + _
            "self.close();"
    

内容的提问来源于stack exchange,提问作者jp2code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:22:03