是否有标准的方法将.NET字符串编码为JavaScript字符串以便在MS Ajax中使用?

Ric*_*ews 73 javascript c# asp.net ajax encoding

我正在尝试使用RegisterStartUpScript.NET 3.5中的MS ScriptManager 的方法将SQL Server异常的输出传递给客户端.这适用于某些错误,但当异常包含单引号时,警报失败.

我不想只是逃避单引号.是否有一个标准函数我可以调用以逃避任何特殊字符在JavaScript中使用?

string scriptstring = "alert('" + ex.Message + "');";         
ScriptManager.RegisterStartupScript(this, this.GetType(), "Alert", scriptstring , true);
Run Code Online (Sandbox Code Playgroud)

编辑:

谢谢@tpeczek,代码几乎为我工作:)但稍微修改(单引号的转义)它是一种享受.

我在这里包括了我的修改版本......

public class JSEncode
{
    /// <summary>
    /// Encodes a string to be represented as a string literal. The format
    /// is essentially a JSON string.
    /// 
    /// The string returned includes outer quotes 
    /// Example Output: "Hello \"Rick\"!\r\nRock on"
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    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 '\\':
                    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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如下所述 - 原始来源:这里

Rus*_*Cam 180

你看过了HttpUtility.JavaScriptStringEncode吗?

  • Upvoted,因为它是一个很好的答案 - 但仅适用于.NET 4 (9认同)
  • 我认为当有特定任务的框架功能(比如这个)时,它通常比自己动手的更可靠和准确,所以最好坚持下去. (5认同)
  • @eddy,问题陈述.NET 3.5,而不是4,这个代码仅适用于4+.这就是为什么它不是答案. (2认同)

bob*_*nce 10

具有此功能的探针是它不会对封装HTML中通常带外的字符进行编码...因此,如果您尝试"在属性值中包含字符串,或者如果您有带有</script>脚本元素内部序列的字符串.这可能导致脚本注入和XSS.

你可以添加:

            case '<':
                sb.Append("\\x3C");
                break;
            case '"':
                sb.Append("\\x22");
                break;
            case '&':
                sb.Append("\\x26");
                break;
Run Code Online (Sandbox Code Playgroud)

通常,使用标准JSON编码器可能比使用自己的JS字符串文字编码器更好.这将允许您将任何简单的数据类型传递给JS而不仅仅是字符串.

在.NET 3.5中,您可以获得JavaScriptSerializer,但请注意,虽然这编码<\u003C(因此输出将适合在<script>元素中使用),但它不会编码&",因此需要HTML转义才能将此类内容包含在XHTML脚本元素需要属性值和CDATA包装器.

(与许多JSON编码器一样,它也无法对U + 2028 LINE SEPARATOR和U + 2029 PARAGRAPH SEPARATOR字符进行编码.由于转义了所有非ASCII字符,上面的代码确实存在.这会导致'未终止的字符串文字'错误这些字符包含在JS字符串文字中,因为JavaScript无益地将它们视为与ASCII换行符相同.)