【问题标题】:Best way to put user input into generated javascript?将用户输入放入生成的 javascript 的最佳方法?
【发布时间】:2011-03-03 08:05:57
【问题描述】:

我需要有人能够将一些文本放入页面,然后将其发送到服务器,保存在数据库中,然后将此文本放入 javascript 变量中。

基本上是这样的:

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

转义这些数据的最佳方法是什么?是否已经有任何东西可以处理'" 和新行之类的事情? base64 是我唯一的选择吗?

我的服务器端框架/语言是 ASP.Net/C#

【问题讨论】:

  • @Nick 我们将来可能会迁移,但截至目前,不,我们仍在 3.5 上

标签: c# javascript encoding base64


【解决方案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();
}

【讨论】:

  • 你“适应”的代码真的很粗糙。让它工作需要AppendAsUnicode 方法。我发现这个虽然更完整(但看起来和你的一样)kooboo.svn.codeplex.com/svn/trunk/Everest.Library/Json/…
  • 进一步看,这似乎是一个完全不同的变量名称。您是否将此代码基于上面的链接?我需要知道,因为上面的许可证是 GPL。我还注意到你在这里也使用了它:stackoverflow.com/questions/2714546/…
  • 啊等等,没关系。 koders.com/csharp/… 是 AjaxControlToolKit 的来源。显然,kooboo 项目将其从那里撕下,然后将其置于他们自己的版权和 GPL 许可之下....这段代码实际上是在 Microsoft 公共许可下,但没关系..
  • 我基于.Net参考源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2010-09-13
  • 2012-11-12
  • 2021-06-11
  • 1970-01-01
  • 2010-10-15
  • 2015-07-27
相关资源
最近更新 更多