73 votes

Est-il un moyen standard pour encoder un .NET chaîne de caractères en JavaScript chaîne pour une utilisation dans MS Ajax?

Je suis en train de passer de la sortie de SQL Server exception pour le client à l'aide de l' RegisterStartUpScript méthode de la MS ScriptManager .NET 3.5. Cela fonctionne très bien pour quelques erreurs, mais lorsque l'exception contient des apostrophes l'alerte échoue.

Je ne veux pas seulement échapper les guillemets simples. Est-il une fonction standard, je peux appeler pour échapper les caractères spéciaux pour une utilisation en JavaScript?

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

EDIT:

Merci @tpeczek, le code presque fonctionné pour moi :) mais avec une légère modification (l'échappement de guillemets simples), il fonctionne un régal.

J'ai inclus ma version modifiée ici...

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();
    }
}

Comme mentionné ci-dessous - source originale: ici

180voto

Russ Cam Points 58168

Avez-vous eu un coup d'oeil à l' HttpUtility.JavaScriptStringEncode?

10voto

bobince Points 270740

Un problème avec cette fonction, c'est qu'il n'a pas d'encoder des caractères qui sont généralement hors de la bande dans l'encapsulation de code HTML... donc, si vous voulez avoir des problèmes si vous avez essayé d'inclure une chaîne avec " à l'intérieur de la valeur d'un attribut, ou si vous avez eu une chaîne de caractères avec la séquence de </script> à l'intérieur d'un élément de script. Qui pourrait conduire à un script d'injection et de XSS.

Vous pourriez ajouter:

            case '<':
                sb.Append("\\x3C");
                break;
            case '"':
                sb.Append("\\x22");
                break;
            case '&':
                sb.Append("\\x26");
                break;

En général, il serait probablement préférable d'utiliser une norme JSON codeur de brasser votre propre JS chaîne littérale de l'encodeur. Cela vous permettra de passer n'importe quel type de données simple JS plutôt que de simplement les chaînes de caractères.

Dans .NET 3.5, vous obtenez JavaScriptSerializertoutefois de noter que, bien que ce ne codent < de \u003C (donc la sortie sera adapté pour une utilisation dans un <script> élément), il n'a pas coder & ou ", donc HTML échapper serait nécessaire d'inclure ce contenu dans une valeur d'attribut et une CDATA wrapper serait nécessaire pour XHTML éléments de script.

(En commun avec de nombreux JSON codeurs, c'est aussi ne pas coder le U+2028 SÉPARATEUR de LIGNE et U+2029 PARAGRAPHE caractères de séparation. Le code ci-dessus, en raison de s'échapper tous les caractères non-ASCII. Cela provoque des "intermédiaires de la chaîne littérale" erreurs lorsque ces caractères sont inclus dans un JS littéral de chaîne, parce que JavaScript unhelpfully les traite de la même façon qu'un saut de ligne ASCII.)

5voto

tpeczek Points 12722

Vous pouvez lire cet article, qui montre une belle méthode de codage de chaîne pour le javascript: http://www.west-wind.com/weblog/posts/114530.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X