2010-02-05 17 views
1

Je voudrais utiliser des balises de serveur dans une fonction Javascript:Accès Tags serveur à l'intérieur Javascript dans le projet MVC

<%=Model.HtmlProperty%> 

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

Rick Strahl a un coupleposts sur ce problème dans un projet de formulaires Web, mais je suis à la recherche d'une solution élégante pour un projet MVC.

MISE À JOUR: La réponse de Robert Harvey ci-dessous suggère d'encoder le code HTML. Encore une fois, que n'est pas ce que je veux faire. En fin de compte, j'essaye d'injecter le script html dans une instance de fckeditor. Cela doit être fait en javascript. J'essaie de comprendre comment accéder à la valeur de <%=Model.HtmlProperty%> dans javascript sans stocker le texte codé dans un élément d'entrée caché.

+0

Vous pouvez stocker le contenu de l'intérieur div caché; à l'intérieur de la variable JS; comme fonction JS qui retourne une chaîne; il suffit de l'encoder correctement. Vous ne pouvez pas accéder aux tags de serveur à partir de JS; JS fonctionne dans le navigateur et peut accéder aux variables JS, champs HTML, cookies ... choisissez vous-même. – queen3

Répondre

0

il semble que ce que j'espérais faire - en utilisant les balises de serveur à l'intérieur javascript - est impossible. J'avais stocké la corde dans un élément d'entrée caché, et selon le commentaire de queen3, il semble que je devrais continuer à faire ce que j'ai fait depuis le début. Merci à tous pour votre contribution.

0

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

qui devrait vous permettre d'appeler comme ceci:

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

Merci pour cela, cependant, cela ne me permettra pas d'utiliser un tag serveur dans javascript. J'essaye d'injecter le code html dans fckeditor sans devoir stocker le html encodé à l'intérieur d'un élément html d'entrée caché. S'il vous plaît voir ma mise à jour ci-dessus. – splatto

0

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