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

ChartName有能力包含特殊字符(例如某人的图表)。如果允许,则会导致错误,代码在不期待时会触及'正确的方法转义字符从RegisterStartupScript

处理这种情况的正确方法是什么?我是否需要知道可能导致问题的所有角色,并将其替换为逃逸版本?

回答

3

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

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字符,并且确保有没有破损,如果你的脚本是内联(这将是你的情况)。请注意,它已经为字符串文字生成了引号,因此如果您决定使用它,请记住这一点。

+0

非常有用的实用脚本,谢谢! – 2011-05-16 17:05:17

0

重点是逃避'为您的Javascript字符串。你需要逃脱了\这个角色,使其\'

所以,你的代码变得

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

编辑

我觉得你的代码是假的,上面写着

');".Replace("-", "\\-") 
部分

是无用的。我想你的代码更改

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

但接下来的问题是,你为什么会需要.Replace("-", "\\-")

相关问题