Domanda

Mi piacerebbe utilizzare alcuni tag di server all'interno di una funzione JavaScript:

<%=Model.HtmlProperty%>

In passato ho conservato questo valore in un campo di input nascosto, ma quando una proprietà contiene HTML si ottiene problemi con i caratteri speciali come virgolette. Vorrei evitare di dover codificare e decodificare nel controller per evitare problemi con i caratteri speciali.

Rick Strahl ha un paio messaggi su questo problema in un progetto di moduli web, ma sono alla ricerca di una soluzione elegante per un progetto MVC.

Aggiorna : la risposta di Robert Harvey seguito suggerisce per codificare il codice html. Anche in questo caso, che non è quello che voglio fare . In definitiva, sto cercando di iniettare script HTML in un'istanza fckeditor. Questo deve essere fatto in javascript. Sto cercando di capire come accedere al valore della <%=Model.HtmlProperty%> all'interno javascript senza memorizzare testo codificato in un elemento di input nascosto.

È stato utile?

Soluzione 2

Sembra che quello che speravo di fare - utilizzando i tag di server all'interno javascript - non è possibile. Mi era stato la memorizzazione della stringa all'interno di un'elemento di input nascosto, e come per il commento di queen3, sembra che dovrò continuare a fare quello che ho fatto per tutto il tempo. Grazie a tutti per il vostro input.

Altri suggerimenti

Prestito dal post di Rick Strahl, e cambiando la firma di chiamata un po ', la funzione per codificare una stringa javascript (dopo aver cambiato in un metodo di estensione per la classe HTML) si presenta così:

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

che dovrebbe consentire di chiamare in questo modo:

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

Usa HtmlHelper per scrivere lo script al volo ..


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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top