2013-09-17 4 views
0

Я использую этот код для создания строки кода javascript и запускаю их из кода C#.Недопустимый символ, нарушающий скрипт

Он работает нормально для нормальных значений, но ломается, когда в значениях присутствует (апостроф).

StringBuilder sb = new StringBuilder(); 
sb.Append("<script>"); 

// Store transmission chrome feature. 
for(int i=0; i < Transmission.Length; i++) 
{ 
    sb.Append("var obj = {text: '" + Transmission[i][0] + "'," 
             + "value: '" + Transmission[i][1] +"'};"); 
    sb.Append("transChromeData.push(obj);"); 
} 

sb.Append("</" + "script>"); 
this.RegisterStartupScript("Info", sb.ToString()); 

ответ

0

Он также сломаться, если кто-то добавляет \ в качестве значения. Вам нужно бежать символы, которые будут нарушать строку Javascript - HttpUtility.JavaScriptStringEncode будет делать это для вас:

StringBuilder sb = new StringBuilder(); 
sb.Append("<script>"); 

// Store transmission chrome feature. 
for(int i=0; i < Transmission.Length; i++) 
{ 
    sb.Append("var obj = {text: '" + HttpUtility.JavaScriptStringEncode(Transmission[i][0]) + "'," 
             + "value: '" + HttpUtility.JavaScriptStringEncode(Transmission[i][2]) +"'};"); 
    sb.Append("transChromeData.push(obj);"); 
} 

sb.Append("</" + "script>"); 
this.RegisterStartupScript("Info", sb.ToString()); 

Для архаических версий .NET, вам нужно свернуть свой собственный. Рик Стрэхл имеет good implementation, который охватывает различные символы JS: вытекающее функцию

public static string EncodeJsString(string s) 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append("\""); 
    foreach (char c in s) 
    { 
     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("\""); 

    return sb.ToString(); 
} 
+0

Я работаю на asp.net 1.1 ... это не поддерживает там – James

+0

Добавлено решение для .NET 1.1 – CodingIntrigue

0

использование Microsoft JScript

Microsoft.JScript.GlobalObject.escape("String to escape"); 

ниже код отредактированный

StringBuilder sb = new StringBuilder(); 
sb.Append("<script>"); 

// Store transmission chrome feature. 
for(int i=0; i < Transmission.Length; i++) 
{ 
    sb.Append("var obj = {text: '" + Microsoft.JScript.GlobalObject.escape(Transmission[i][0]) + "'," 
             + "value: '" + Microsoft.JScript.GlobalObject.escape(Transmission[i][1]) +"'};"); 
    sb.Append("transChromeData.push(obj);"); 
} 

sb.Append("</" + "script>"); 
this.RegisterStartupScript("Info", sb.ToString()); 

в качестве альтернативы вы можете использовать

HttpUtility.UrlDecode 

, но это будет небезопасно

на asp.net 1.1 пытаются использовать код предлагаемых здесь http://www.west-wind.com/weblog/posts/2007/Jul/14/Embedding-JavaScript-Strings-from-an-ASPNET-Page

0

Попробуйте это:

StringBuilder sb = new StringBuilder(); 
sb.Append("<script>"); 

// Store transmission chrome feature. 
for (int i = 0; i < Transmission.Length; i++) 
{ 
    sb.Append("var obj = {text: '") 
     .Append(Escape(Transmission[i][0])) 
     .Append("',") 
     .Append("value: '") 
     .Append(Escape(Transmission[i][1])) 
     .Append("'};") 
     .Append("transChromeData.push(obj);"); 
} 

sb.Append("</script>"); 
this.RegisterStartupScript("Info", sb.ToString()); 

... 

static string Escape(string source) 
{ 
    return source.Replace(@"'", @"\'"); 
} 
Смежные вопросы