C# 为什么JSON响应中的HTML会被编码?
我正在使用,详细介绍了如何使用jQuery和jTemplates将JSON响应填充到模板中 我的问题是,其中一个返回字段(名为Description)包含HTML,但HTML括号被编码为\u003C和\u003e 以下是服务器返回的HTML(在描述字段中):C# 为什么JSON响应中的HTML会被编码?,c#,jquery,json,asp.net-mvc-2,jtemplate,C#,Jquery,Json,Asp.net Mvc 2,Jtemplate,我正在使用,详细介绍了如何使用jQuery和jTemplates将JSON响应填充到模板中 我的问题是,其中一个返回字段(名为Description)包含HTML,但HTML括号被编码为\u003C和\u003e 以下是服务器返回的HTML(在描述字段中): <a href="/en/Yokota/User/Show/Chad">Chad</a> updated their ad, <a href="/en/Yokota/Ad/Show/100">Valida
<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>
请注意“\u003c”或“\u003e”。这些看起来像是unicode逃逸,但为什么会发生这种情况?下面是调用JSON响应的jQuery:
$.getJSON("<%= Url.Action("List", "Activity") %>",
function(data){
$("#aLog").setTemplate($("#templateHolder").html());
$("#aLog").processTemplate(data);
});
也许是因为快凌晨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列表()
{
IList contracts=新列表();
var activityList=_db.Activity.ByBaseID(CurrentBase.BaseID).OrderByDescending(a=>a.dateoccurrent);
foreach(activityList中的变量a){
contracts.Add(新的ActivityContract{TypeOfActivity=a.TypeOfActivity.ToString(),Description=a.Description,DateOccount=a.DateOfActivity.ToString());
}
返回Json(contracts,JsonRequestBehavior.AllowGet);
}
使用utf8中的“contentType”进行如下检查
$.ajax({
键入:“获取”,
url:“”,
数据:“{}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:功能(数据){
$(“#aLog”).setTemplate($(“#templateHolder”).html();
$(“#aLog”).processTemplate(数据);
}
});
});
JSONSerializer使用unicode转义序列自动转义“”字符
jQuery应该能够正常解析这些。您使用的是$.getJSON方法,我认为该方法会自动将响应计算为json并取消对其进行scape,因此我有点困惑,为什么最终输出仍然包含转义代码
如果您这样做:
$("#aLog").processTemplate(eval("(" + data+ ")"));
这解决了问题吗?事实证明,问题在于jTemplates中的设置。setTemplate行需要如下所示:
$("#aLog").setTemplate($("#templateHolder").html(), [], {filter_data: false});
特别是,必须将filter_数据设置为false。默认情况下,jTemplates html编码;(您的操作方法如何返回值?作为JsonResult?我们可以看到代码吗?
processTemplate
做什么?@womp我添加了控制器代码。感谢您的快速响应。@Gumbo-不太确定,这是Microsoft对jQuery团队的贡献,jTemplates!=MS jQuery模板库。它完全不同。看起来像对我来说,模板引擎正在做你告诉它做的事情。你给它数据来显示,它正在显示。如果你想让数据成为HTML,引擎需要知道这一点。我不知道jTemplates,所以我不能说这是一个什么样的功能。这是我最初编写它的方式,同样的问题。你确定ver在请求中接受application/json?它没有接受,但是感谢您提供关于JSONSerializer自动转义HTML实体的信息。
$.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);
}
});
});
$("#aLog").processTemplate(eval("(" + data+ ")"));
$("#aLog").setTemplate($("#templateHolder").html(), [], {filter_data: false});