2010-02-05 25 views
1

我想使用JavaScript函数内部的一些服务器标签:访问服务器标签在MVC项目

<%=Model.HtmlProperty%> 

在我已经保存在一个隐藏的输入字段与此值过去,但是当一个属性包含HTML,您会遇到引号等特殊字符出现问题。我想避免在控制器中编码和解码,以避免特殊字符的问题。

Rick Strahl在网络表单项目中有一个coupleposts在这个问题上,但我正在寻找一个优雅的MVC项目解决方案。

UPDATE:罗伯特哈维的回答下面建议编码的HTML。再说一次,那不是我想要做的。最终,我试图将html脚本注入到fckeditor实例中。这必须在JavaScript中完成。我试图弄清楚如何在javascript中访问<%=Model.HtmlProperty%>的值,而不将编码文本存储在隐藏的输入元素中。

+0

您可以将它藏在里面的div内容;里面的JS变量;作为返回字符串的JS函数;只是编码正确。你不能从JS访问服务器标签; JS在浏览器中工作,可以访问JS变量,HTML字段,Cookie ...选择你自己。 – queen3 2010-02-05 21:08:14

回答

0

看来,我希望做的 - 在javascript内使用服务器标签 - 是不可能的。我一直在一个隐藏的输入元素中存储字符串,根据queen3的评论,似乎我将不得不继续做我一直在做的事情。谢谢各位的意见。

0

从里克施特拉尔的帖子借款,并改变调用签名位,编码一个JavaScript字符串(改变成用于HTML类的扩展方法后)的功能如下:

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

哪应该让你这样称呼它:

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

但是,谢谢你,这不会让我在JavaScript内部使用服务器标签。我试图将html代码注入fckeditor,而不必将隐藏的输入html元素中的编码html存储。请参阅我上面的更新。 – splatto 2010-02-05 21:08:28

0

使用的HtmlHelper写上飞脚本..

 

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