如何替换已弃用的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
相关产品推荐
相关产品推荐

