【问题标题】:Why does the HTML in my JSON response get encoded?为什么我的 JSON 响应中的 HTML 会被编码?
【发布时间】:2010-06-22 17:37:41
【问题描述】:

我正在使用this blog post as a guide,详细说明如何使用带有 jTemplates 的 jQuery 将 JSON 响应填充到模板中。

我的问题是,返回的字段之一(名为描述)包含 HTML,但 HTML 括号被编码为 \u003C 和 \u003e。

这是服务器返回的 HTML(在描述字段中):

<a href="/en/Yokota/User/Show/Chad">Chad</a> updated their ad, <a href="/en/Yokota/Ad/Show/100">Validation Test Ad Again</a>, @<a href="/en/Yokota">Yokota</a>

JSON 响应如下所示:

[{"TypeOfActivity":"0","Description":"\u003ca href=\"/en/Yokota/User/Show/YokotaTour\"\u003eYokotaTour\u003c/a\u003e posted \u003ca href=\"/en/Yokota/Ad/Show/166\"\u003eOne of the best for sure\u003c/a\u003e for sale @\u003ca href=\"/en/Yokota\"\u003eYokota\u003c/a\u003e","DateHappened":"6/23/2010 12:26:55 AM"}]

注意“\u003c”或“\u003e”。那些看起来像 unicode 转义,但为什么会这样呢?这是调用 JSON 响应的 jQuery:

$.getJSON("<%= Url.Action("List", "Activity") %>",
    function(data){
        $("#aLog").setTemplate($("#templateHolder").html());
        $("#aLog").processTemplate(data);
    });

更新

这是页面加载完成后源代码的样子(在 Firefox 中查看 > 页面源代码):

&lt;a href="/en/Yokota/User/Show/Chad"&gt;Chad&lt;/a&gt; updated their ad, &lt;a href="/en/Yokota/Ad/Show/100"&gt;Validation Test Ad Again&lt;/a&gt;, @&lt;a href="/en/Yokota"&gt;Yokota&lt;/a&gt;

也许是因为快到凌晨 3 点了,但我很难过……非常感谢任何帮助 - 谢谢!

更新 2

public JsonResult List()
{
    IList<ActivityContract> contracts = new List<ActivityContract>();
    var activityList = _db.Activity.ByBaseID(CurrentBase.BaseID).OrderByDescending(a => a.DateHappened);
    foreach (var a in activityList) {
        contracts.Add(new ActivityContract { TypeOfActivity = a.TypeOfActivity.ToString(), Description = a.Description, DateHappened = a.DateHappened.ToString() });
    }
    return Json(contracts, JsonRequestBehavior.AllowGet);
}

【问题讨论】:

  • 您的操作方法如何返回值?作为 JsonResult?我们可以看到代码吗?
  • processTemplate 是做什么的?
  • @womp 我添加了控制器代码。感谢您的快速回复。
  • @Gumbo - 不确定,这是微软对 jQuery 团队的贡献,jtemplates.tpython.com
  • jTemplates != MS jQuery 模板库。这是完全不同的。在我看来,模板引擎正在做你告诉它做的事情。您正在给它显示数据,它正在显示它。如果您打算将数据设为 HTML,则引擎需要知道这一点。我不知道 jTemplates,所以我不能说它是如何或是否是一个特性。

标签: c# jquery json asp.net-mvc-2 jtemplate


【解决方案1】:

原来,问题出在 jTemplates 中的设置上。 setTemplate 行需要是这样的:

$("#aLog").setTemplate($("#templateHolder").html(), [], {filter_data: false});

特别是,filter_data 必须设置为 false。默认情况下 jTemplates html 编码。 ;(

【讨论】:

    【解决方案2】:

    在示例中使用 utf8 中的“contentType”进行这样的检查 your example

           $.ajax({
                    type:"GET",
                    url: "<%= Url.Action("List", "Activity") %>",
                    data: "{}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(data){
                        $("#aLog").setTemplate($("#templateHolder").html());
                        $("#aLog").processTemplate(data);
                    }
                });
            });
    

    【讨论】:

    • 这是我原来的写法,同样的问题。
    • 你确定服务器接受请求中的 application/json 吗?
    【解决方案3】:

    JSONSerializer 使用 unicode 转义序列自动转义“”字符。

    jQuery 应该能够正常解析这些。您正在使用 $.getJSON 方法,我认为该方法会自动将响应评估为 json 并将其取消转义,所以我对为什么最终输出仍然包含转义码感到有些困惑。

    如果你这样做:

    $("#aLog").processTemplate(eval("(" + data+ ")"));
    

    这能解决问题吗?

    【讨论】:

    • 它没有,但感谢有关 JSONSerializer 自动转义 HTML 实体的信息。
    猜你喜欢
    • 2018-06-06
    • 1970-01-01
    • 2015-11-01
    • 2011-06-16
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多