Accès à Tags serveur à l'intérieur Javascript dans le projet MVC
-
18-09-2019 - |
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
La solution 2 Il semble que ce que j'espérais faire - en utilisant les balises de serveur à l'intérieur javascript - est impossible. J'avais le stockage de la chaîne à l'intérieur d'un élément d'entrée caché, et selon le commentaire de Reine3, il semble que je vais devoir continuer à faire ce que je fais tout le long. Merci à tous pour vos commentaires.
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);
}