2010-06-13 2 views
1

Мне нужно, чтобы кто-то мог поместить некоторый текст на страницу, а затем он отправляется на сервер, сохраняется в базе данных, и где этот текст помещается в переменную javascript.Лучший способ вставить пользовательский ввод в сгенерированный javascript?

В принципе, как это:

Write("var myVar=\""+MyData+"\";"); 

Каков наилучший способ избежать этой информации? Есть ли что-нибудь там, чтобы иметь дело с вещами вроде ' и " и новыми линиями? Является ли base64 моим единственным вариантом?

Мои рамки серверной/язык ASP.Net/C#

+0

На каком языке? – SLaks

+0

@SLa обновил вопрос – Earlz

+0

Вы на .Net 4? –

ответ

0

Вы должны использовать WPL:

Write("var myVar=" + Encoder.JavaScriptEncode(MyData, true) + ";"); 

, если вы не хотите, чтобы ссылаться на библиотеку, вы можете использовать следующую функцию (адаптировано от источника .Net):

public static void QuoteString(this string value, StringBuilder b) { 
    if (String.IsNullOrEmpty(value)) 
     return ""; 

    var b = new StringBuilder(); 
    int startIndex = 0; 
    int count = 0; 
    for (int i = 0; i < value.Length; i++) { 
     char c = value[i]; 

     // Append the unhandled characters (that do not require special treament) 
     // to the string builder when special characters are detected. 
     if (c == '\r' || c == '\t' || c == '\"' || c == '\'' || c == '<' || c == '>' || 
      c == '\\' || c == '\n' || c == '\b' || c == '\f' || c < ' ') { 
      if (b == null) { 
       b = new StringBuilder(value.Length + 5); 
      } 

      if (count > 0) { 
       b.Append(value, startIndex, count); 
      } 

      startIndex = i + 1; 
      count = 0; 
     } 

     switch (c) { 
      case '\r': 
       b.Append("\\r"); 
       break; 
      case '\t': 
       b.Append("\\t"); 
       break; 
      case '\"': 
       b.Append("\\\""); 
       break; 
      case '\\': 
       b.Append("\\\\"); 
       break; 
      case '\n': 
       b.Append("\\n"); 
       break; 
      case '\b': 
       b.Append("\\b"); 
       break; 
      case '\f': 
       b.Append("\\f"); 
       break; 
      case '\'': 
      case '>': 
      case '<': 
       AppendCharAsUnicode(b, c); 
       break; 
      default: 
       if (c < ' ') { 
        AppendCharAsUnicode(b, c); 
       } else { 
        count++; 
       } 
       break; 
     } 
    } 

    if (b == null) { 
     b.Append(value); 
    } 

    if (count > 0) { 
     b.Append(value, startIndex, count); 
    } 

    return b.ToString(); 
} 
+0

Вы «адаптированный» код очень грубый. Для его работы требуется метод «AppendAsUnicode». Я нашел это, хотя и более полное (но выглядит так же, как ваше). Https://kooboo.svn.codeplex.com/svn/trunk/Everest.Library/Json/JSONHelper.cs – Earlz

+0

, смотрящий далее, он кажется точным тиражом с некоторыми несколько разных имен переменных. Вы основывали этот код на этой ссылке выше? Мне нужно знать, потому что лицензия выше GPL. Я также заметил, что вы использовали ее здесь тоже: http://stackoverflow.com/questions/2714546/access-variable-from-code-behind-via-jqery/2714563#2714563 – Earlz

+0

ah wait, nevermind. http://www.koders.com/csharp/fidBFC9EC6A462D72BD2E6AA18F76B771781E8504F8.aspx?s=cdef%3Aajax является источником AjaxControlToolKit. По-видимому, проект 'kooboo' разорвал его оттуда, а затем разместил под своим авторским правом и лицензией GPL ... этот код фактически находится под лицензией Microsoft, хотя это не имеет значения. – Earlz

Смежные вопросы