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

IIS环境下启用C#代码中Javascript脚本问题求助

ASP.NET嵌入JS在IIS部署后无法运行的解决办法

1. 修复代码语法错误

你的代码存在明显的字符串拼接语法问题,直接导致生成的JS脚本无效:

  • 初始字符串里的'";是错误的引号转义逻辑,会引发JS语法中断
  • 字符串拼接未正确闭合,生成的脚本结构不完整

修正后的代码示例:

protected void GetDateCal_SelectionChanged(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(Request.QueryString["textbox"]))
    {
        string textBoxId = "ctl00_ContentPlaceHolder1_" + Request.QueryString["textbox"];
        // 统一日期格式,避免不同区域格式导致的JS解析问题
        string selectedDate = GetDateCal.SelectedDate.ToString("yyyy-MM-dd");
        
        // 用StringBuilder拼接更清晰,同时正确处理引号嵌套
        StringBuilder strScript = new StringBuilder();
        strScript.Append("<script type='text/javascript'>");
        strScript.AppendFormat("window.opener.document.getElementById('{0}').value = '{1}';", textBoxId, selectedDate);
        strScript.Append("window.opener.document.forms[0].submit();");
        strScript.Append("self.close();");
        strScript.Append("</script>");
        
        // 改用RegisterStartupScript,确保脚本在DOM就绪后执行
        Page.ClientScript.RegisterStartupScript(this.GetType(), "Calendar_ChangeDate", strScript.ToString());
    }
}

2. 优化脚本执行逻辑

  • 原代码用document.forms[0].元素ID定位控件,易因页面结构变化失效,改用document.getElementById()定位更可靠
  • RegisterClientScriptBlock会将脚本插入到<form>标签开头,虽然弹窗场景下opener页面已加载,但RegisterStartupScript会将脚本放在</form>之前,能确保DOM元素已就绪,避免找不到控件的问题

3. 验证生成的脚本有效性

部署后打开浏览器开发者工具(F12)排查:

  • 查看控制台,确认是否有JS语法错误或“元素未找到”的报错
  • 查看页面源码,找到生成的脚本块,检查:
    • 拼接后的元素ID是否与opener页面中控件的实际ID完全一致
    • 日期字符串是否正确,有无特殊字符导致JS字符串中断

4. 安全防护提示

直接使用Request.QueryString["textbox"]拼接脚本存在XSS注入风险,建议对参数进行验证:

string textBoxName = Request.QueryString["textbox"];
// 限制参数仅允许字母、数字和下划线
if (!string.IsNullOrEmpty(textBoxName) && Regex.IsMatch(textBoxName, @"^[a-zA-Z0-9_]+$"))
{
    // 执行后续逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:55:16