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/