为什么我的JSON响应中的HTML被编码?

时间:2010-06-22 17:37:41

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

我正在使用this blog post as a guide,详细说明了如何将jQuery与jTemplates一起使用来将JSON响应填充到模板中。

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

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

<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中查看&gt;页面源代码):

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

3 个答案:

答案 0 :(得分:3)

事实证明,问题在于jTemplates中的设置。 setTemplate行必须是这样的:

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

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

答案 1 :(得分:0)

在示例中使用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);
                }
            });
        });

答案 2 :(得分:0)

JSONSerializer会自动转义“&lt;”和“&gt;”具有unicode转义序列的字符。

jQuery应该能够正常解析这些。你正在使用$ .getJSON方法,我认为它会自动将响应评估为json和unescape它,所以我有点难以理解为什么最终输出仍然包含转义码。

如果你这样做:

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

是否解决了这个问题?