Question

Je voudrais utiliser des balises de serveur dans une fonction Javascript:

<%=Model.HtmlProperty%>

Dans le passé, j'ai stocké cette valeur dans un champ d'entrée caché, mais quand une propriété contient HTML vous avez des problèmes avec des caractères spéciaux tels que les guillemets. Je voudrais éviter d'avoir à coder et décoder dans le contrôleur pour éviter des problèmes avec des caractères spéciaux.

Rick Strahl a un deux

Autres conseils

Emprunts de poste de Rick Strahl, et de changer la signature d'appel un peu, la fonction pour coder une chaîne javascript (après le changement dans une méthode d'extension pour la classe Html) ressemble à ceci:

public static string EncodeJsString(this HtmlHelper h, string s)
{
    StringBuilder sb = new StringBuilder();
    sb.Append("\"");
    foreach (char c in s)
    {
        switch (c)
        {
            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();
}

Ce qui devrait vous permettre d'appeler comme ceci:

<%= Html.EncodeJsString(Model.HtmlProperty) %>

Utilisez HtmlHelper pour écrire votre script à la volée ..


public static string WriteLightboxScript(this HtmlHelper helper, string galleryName)
        {
            var builder = new TagBuilder("script");
            builder.MergeAttribute("type", "text/javascript");
            builder.SetInnerText("$(function() {$('a[rel=" + galleryName + "]').lightBox();});");
            return builder.ToString(TagRenderMode.Normal);
        }

scroll top