在Mvc3中使用ajax调用的ContentResult和DataType

时间:2012-04-02 15:50:38

标签: c# ajax json asp.net-mvc-3 fusioncharts

最近,我搜索了一个很好的引擎,用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

感谢您的时间。

1 个答案:

答案 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方法来更有效地解压缩响应。