最近,我搜索了一个很好的引擎,用Asp.Net Mvc 3生成图表。我终于找到了FusionChart,它有各种各样的图表类型。
为了帮助我创建显示图表所需的xml,我找到了项目Libero。此项目在xml和对象模型之间创建抽象级别,以定义图形的属性。
该项目使用Mvc2,我试图将其转换为Mvc3。除一个样品外,所有样品均完美无缺带有ajax调用的示例。
在示例中,控制器返回一个ContentResult,它返回一个xml以动态更新图形。该项目在Mvc2中完美运行,但在Mvc3中没有。
以下是控制器中的代码:
public ActionResult GetSalesXmlData(string period, string chartType, string chartTemplate)
{
var salesXmlData = this.Content(GetSalesChart(period, chartType, chartTemplate).ToXML(), "text/xml");
return salesXmlData;
}
以下是视图中的代码:
$.ajax({
url: "/Home/GetSalesXmlData",
type: "POST",
data: { chartType: chartType, chartTemplate: chartTemplate, period: period },
dataType: "application/JSON",
success: function (data) {
Chart01.xmlData = data;
Chart01.chartType = chartType;
Chart01.showChart();
},
error: function () {
alert("XMLHttpRequest=" + XMLHttpRequest.responseText + "\ntextStatus=" + textStatus + "\nerrorThrown=" + errorThrown);
}
});
当我尝试在Mvc3中执行此代码时,收到此错误:
textStatus = parsererror errorThrown =没有从xml到application / json的转换
在搜索了一段时间之后,我找到了如何在stackoverflow question中解决我的问题。
阅读本文后,我将控制器代码更改为:
public JsonResult GetSalesXmlData(string period, string chartType, string chartTemplate)
{
var salesXmlData = this.Json(GetSalesChart(period, chartType, chartTemplate).ToXML(), "text/xml");
return salesXmlData;
}
我的ajax打电话给你:
$.ajax({
url: "/Home/GetSalesXmlData",
type: "POST",
data: { chartType: chartType, chartTemplate: chartTemplate, period: period },
dataType: "text json",
success: function (result) {
Chart01.xmlData = result;
Chart01.chartType = chartType;
Chart01.showChart();
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("XMLHttpRequest=" + XMLHttpRequest.responseText + "\ntextStatus=" + textStatus + "\nerrorThrown=" + errorThrown);
}
});
我的问题是:为什么在将我的项目从Mvc2转换为Mvc3之后,我必须将控制器的结果返回从ContentResult更改为JsonResult,在我看来,将 application / JSON 中的dataType值更改为 text json ?
感谢您的时间。
答案 0 :(得分:3)
在您的原始示例中,您指示jQuery将响应解析为JSON,即使它是XML。如果您作为MVC升级过程的一部分从较旧版本的jQuery升级到较新版本,那么这将解释解析器错误。较早版本的jQuery在解析AJAX响应方面相当快且松散,但是当jQuery认为响应是JSON或者明确告诉它将它们视为处理时,后来的版本已经开始使用JSON.parse
。
您的新版本通过对XML进行XML和JSON序列化来解决这个问题。虽然技术上确实有效,但它增加了一个低效的冗余序列化层。
如果您将dataType
更改为text/xml
?
说到效率,您是否考虑过使用JSON而不是XML? FusionCharts appears to support that。然后,您可以完全避免使用XML,通过线路使用更紧凑的序列化,并利用浏览器的本机JSON.parse
方法来更有效地解压缩响应。