Лучший способ поместить пользовательский ввод в сгенерированный javascript?

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

В основном так:

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

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

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


person Earlz    schedule 13.06.2010    source источник
comment
@Ник, мы можем мигрировать в будущем, но на данный момент нет, мы все еще на 3.5   -  person Earlz    schedule 14.06.2010


Ответы (1)


Вы должны использовать 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();
}
person SLaks    schedule 14.06.2010
comment
Ваш адаптированный код действительно грубый. Чтобы заставить его работать, требуется метод AppendAsUnicode. Я нашел это, хотя оно более полное (но похоже на ваше) kooboo.svn.codeplex.com/svn/trunk/Everest.Library/Json/ - person Earlz; 14.06.2010
comment
глядя дальше, кажется, что это точный рип с некоторыми немного другими именами переменных. Вы основывали этот код на этой ссылке выше? Мне нужно знать, потому что указанная выше лицензия — GPL. Я также заметил, что вы использовали ее и здесь: stackoverflow.com/questions/2714546/ - person Earlz; 14.06.2010
comment
ах подождите, неважно. koders.com/csharp/ является источником AjaxControlToolKit . Судя по всему, проект kooboo вырвал его оттуда, а затем поместил под свои авторские права и лицензию GPL... этот код на самом деле находится под общественной лицензией Microsoft, хотя это не имеет значения... - person Earlz; 14.06.2010
comment
Я основывал его на источнике ссылок .Net. - person SLaks; 14.06.2010