c# - 从 RegisterStartupScript 转义字符的正确方法

标签 c# javascript

ScriptManager.RegisterStartupScript(page, 
    page.GetType(),
    "KEY",
    "updateDockTitle('" + ClientID + "', '" + string.Format(format, ChartName, "No Data To Display") + "');".Replace("-", "\\-"),
    true);

ChartName 能够包含特殊字符(例如 Someone's Chart)。如果按原样允许,这会导致错误,代码会在它不期望的时候命中 '

处理这种情况的正确方法是什么?我是否需要知道所有可能导致问题的字符并将它们替换为转义版本?

最佳答案

我发现这个全面​​的解决方案很方便:

private static readonly Regex scriptTagRegex = new Regex(
    "script", RegexOptions.IgnoreCase | RegexOptions.Multiline);

/// <summary>
///     Processes the provided string, creating a quoted JavaScript string literal.
/// </summary>
/// <param name="str">The string to process</param>
/// <returns>A string containing a quoted JavaScript string literal</returns>
public static string JavaScriptStringLiteral(string str)
{
    var sb = new StringBuilder();
    sb.Append("\"");
    foreach (char c in str)
    {
        switch (c)
        {
            case '\"':
                sb.Append("\\\"");
                break;
            case '\\':
                sb.Append("\\\\");
                break;
            case '\b':
                sb.Append("\\b");
                break;
            case '\f':
                sb.Append("\\f");
                break;
            case '\n':
                sb.Append("\\n");
                break;
            case '\r':
                sb.Append("\\r");
                break;
            case '\t':
                sb.Append("\\t");
                break;
            default:
                int i = (int)c;
                if (i < 32 || i > 127)
                {
                    sb.AppendFormat("\\u{0:X04}", i);
                }
                else
                {
                    sb.Append(c);
                }
                break;
        }
    }
    sb.Append("\"");

    // If a Javascript tag contains "</script>", then it terminates a
    // script block.  Start by replacing each 's'/'S' with an escape
    // sequence so it doesn't trigger this.
    return scriptTagRegex.Replace(
        sb.ToString(),
        m => (m.Value[0] == 's' ? "\\u0073" : "\\u0053") + m.Value.Substring(1));
}

它应该替换所有无效的 JS 字符,并且如果您的脚本是内联的(您的情况就是这样),还应确保没有损坏。请注意,它已经为字符串文字生成引号,因此如果您决定使用它,请记住这一点。

关于c# - 从 RegisterStartupScript 转义字符的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6020551/

相关文章:

c# - 解析用户的查询

c# - 使用 LINQ,如何将 IList<IList<object>> 转换为 IList<object>?

javascript - Google map 无法正确显示

javascript - HTML 中的 JSON 转义

javascript - 是否可以使 <div> 可由用户写入?

javascript - 自动翻译网页

c# - C#中的CRC16计算?

c# - 使用 LINQ 对当前和下一个对象进行一些计算

c# - 二维矩阵中两个位置之间的最短路径

php - 如果页面上存在 JavaScript 错误,谷歌地图是否无法加载?