2012-04-02 25 views
2

Ajax调用最近,我搜索了一个良好的发动机与Asp.Net的mvc 3.生成图表我终于找到FusionChart它有一个非常好的品种的图表类型。ContentResult类型和数据类型与在MVC3

帮我创建显示图表所需的XML,我发现这个项目Libero。该项目在xml和对象模型之间创建一个抽象级别来定义图形的属性。

该项目使用Mvc2,我试图将其转换为Mvc3。除了一个样本外,所有样本都完美运行带有Ajax调用的示例。

在该样品中,控制器返回一个返回XML来动态地更新所述图形一个ContentResult类型。该项目在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到应用/ 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,我必须从应用/ JSON改变从ContentResult类型由控制器的结果返回JsonResult在我看来,具体的数据类型值文本JSON

谢谢你的时间。

回答

3

在你原来的例子,你指示的jQuery解析响应为JSON即使它是XML。作为MVC升级过程的一部分,如果您从较旧版本的jQuery升级到较新版本,那将解释解析器错误。老版本的jQuery在解析AJAX响应方面相当快速和松散,但当jQuery相信响应是JSON或者明确地告诉它如此对待它们时,更高版本开始使用JSON.parse

您的较新版本通过采用XML和JSON序列化XML来解决此问题。虽然技术上确实有效,但它增加了一个低效的冗余序列化层。

请问您最初的方式工作,如果你改变了dataTypetext/xml

说到效率,你有没有考虑过使用JSON而不是XML? FusionCharts appears to support that。然后,您可以完全避免使用XML,通过线路使用更紧凑的序列化,并利用浏览器的本机方法来更有效地解压缩响应。

+0

我想深入了解您的知识。我一定会再次阅读和阅读您的建议,并更多地了解我使用的jQuery版本,以及可以与ContentResult一起使用的不同dataType。再次感谢你。我会给你回复我的结果。 – Samuel 2012-04-03 01:14:01