1

我想在 Javascript 函数中使用一些服务器标签:

<%=Model.HtmlProperty%>

过去,我将此值存储在隐藏的输入字段中,但是当属性包含 HTML 时,您会遇到特殊字符(例如引号)的问题。我想避免在控制器中进行编码和解码以避免特殊字符出现问题。

Rick Strahl 在一个 web 表单项目中有几个关于这个问题的 帖子,但我正在为 MVC 项目寻找一个优雅的解决方案。

更新:罗伯特·哈维(Robert Harvey)的回答建议对 html 进行编码。同样,这不是我想要做的。最终,我试图将 html 脚本注入到 fckeditor 实例中。这必须在 javascript 中完成。我试图弄清楚如何<%=Model.HtmlProperty%>在不将编码文本存储在隐藏的输入元素中的情况下访问内部 javascript 的值。

4

3 回答 3

0

借用 Rick Strahl 的帖子,并稍微更改调用签名,用于编码 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) %>
于 2010-02-05T20:55:43.020 回答
0

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

于 2010-02-08T16:43:32.510 回答
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);
        }

于 2010-07-04T14:47:51.130 回答