Accesso a variabili del server all'interno javascript nel progetto MVC
-
18-09-2019 - |
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.
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);
}