ContentResult и DataType с вызовом ajax в Mvc3 - PullRequest
2 голосов
/ 02 апреля 2012

Недавно я искал хороший движок для генерации диаграмм с помощью 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 в приложение / JSON

После поиска некоторое время, я нашелкак исправить мою проблему в этом stackoverflow вопросе .

После прочтения этого поста я изменил свой код контроллера на такой:

  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, и, на мой взгляд, значение dataType из приложения/ JSON до текст json ?

Спасибо за потраченное время.

1 Ответ

3 голосов
/ 03 апреля 2012

В исходном примере вы указывали jQuery анализировать ответ как JSON, даже если это был XML.Если вы обновили более старую версию jQuery до более новой в рамках процесса обновления MVC, это объяснило бы ошибку синтаксического анализатора.Старые версии jQuery были довольно быстрыми и свободными в разборе ответов AJAX, но более поздние версии начали использовать JSON.parse, когда jQuery полагает, что ответом является JSON, или вы явно указали ему обрабатывать их как таковые.

Ваш более новыйВерсия работает вокруг этого, беря XML и JSON-сериализацию этого XML.Хотя это технически работает, он добавил неэффективный уровень избыточной сериализации.

Работает ли ваш оригинальный подход, если вы измените dataType на text/xml?

Говоря об эффективности,Вы рассматривали возможность использования JSON вместо XML? FusionCharts поддерживает это .Затем вы можете полностью отказаться от XML, использовать более компактную сериализацию по проводам и воспользоваться преимуществом встроенного в браузер метода JSON.parse для более эффективной распаковки ответа.

...