Ответ .NET / MVC JSON открывает диалоговое окно для сохранения - PullRequest
2 голосов
/ 31 августа 2009

Я пытаюсь отправить форму с помощью метода jquery ajax в моем приложении .net mvc. Я установил для dataType значение json, а для contentType - "application / json; charset = utf-8". В моем действии контроллера я возвращаю JsonResult.

По какой-то причине ответ JSON не обрабатывается правильно, и вместо этого я получаю диалоговое окно для сохранения файла с объектом JSON внутри него.

$(document).ready(function() {

    $("#editPageContentForm").submit(function() {

        $.ajax(
  {
      type: "POST",
      dataType: "json",
      url: $("#editPageContentForm").attr("action"),
      contentType: "application/json; charset=utf-8",
      data: { ID: $("#id").val(), small_title: $("#small_title").val(), big_title: $("#big_title").val(), body: $("#body").val(), subheading: $("#subheading").val() }, 

      success: function(result) {
          alert('hi');
      },

      error: function(req, status, error) {
          alert("Sorry! We could not receive your feedback at this time.");
      }
  }
 );
 })

В моем действии контроллера у меня есть что-то похожее на:

public JsonResult Edit(int id, string small_title, string big_title, string subheading, string body)
{
     return Json(new {success = true, message = "success"});
}

Почему ответ не возвращается как JSON?

Ответы [ 7 ]

3 голосов
/ 31 августа 2009

Это возвращается как JSON. Но так как вы делаете это в форме отправки, браузер ожидает HTML. Браузер не знает, как визуализировать JSON, поэтому он предлагает вам сохранить. Обратите внимание, что в этот момент ваш код jQuery больше не работает, потому что страница с формой была выгружена, когда браузер POSTed.

Не совсем ясно, что вы намереваетесь, но если вы хотите полностью заменить отправку без AJAX отправкой только для AJAX, попробуйте изменить код на:

$("#editPageContentForm").submit(function(event) {
    event.preventDefault();
    $.ajax(
  {
      type: "POST",
      dataType: "json",
      url: $("#editPageContentForm").attr("action"),
      contentType: "application/json; charset=utf-8",
      data: { ID: $("#id").val(), small_title: $("#small_title").val(), big_title:     
        $("#big_title").val(), body: $("#body").val(), subheading: 
        $("#subheading").val() }, 
      success: function(result) {
          alert('hi');
      },
      error: function(req, status, error) {
          alert("Sorry! We could not receive your feedback at this time.");
      }
  } );
2 голосов
/ 31 августа 2009

Попробуйте добавить return false; в конце вашей функции $("#editPageContentForm").submit().

1 голос
/ 31 августа 2009

Я не знаю почему, но в этой теме аналогичная проблема была решена, просто установив свойство ContentType JsonResult в "application / json; charset = utf-8".

0 голосов
/ 22 ноября 2012

В моем случае я просто возвращаю из действия контроллера ContentResult вместо JsonResult.

  public ContentResult FileImportation(HttpPostedFileBase file)
  {
      return base.Content(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = true, message = "my message" }));
  }

Как видите, я использую Newtonsoft.Json для сериализации моего объекта, но вы можете использовать встроенный в Asp.Net Mvc каркас Json.Convert.

Затем в моем JavaScript-коде я должен вызвать $ .parseJSON с результатом работы сервера.

   onSuccess: function (result) {
      result = $.parseJSON(result);

      if (result.success) {
         alert(result.message);
      }
      else {
         alert("...");
      }
   }

Вот и все! Нет дополнительных параметров в объекте 'option', например 'contentType: "text / html"'.

Я еще не профессионал в расшифровке http-запросов, и я не знаю, изменило ли что-либо значение 'contentType' в опции, но для меня это работает.

Хорошо, вот и все, что я потратил 2 часа своей жизни на поиск ошибок в ххххх, связанных с Internet Explorer.

0 голосов
/ 11 октября 2012

У меня была такая же проблема, и я написал в блоге сообщение с более подробной информацией . Во всяком случае, вот важный бит:

Internet Explorer не понравился тип содержимого в ответе заголовок был «application / json». Установка Content-Type на «text / html» специально для IE в обработчике .asxh перед возвратом JSON ответ сделал свое дело. Теперь он работает, как и ожидалось, во всех браузерах.

Так что попробуйте изменить ContentType ответа.

0 голосов
/ 31 августа 2009

Кажется, это проблема браузера, а не проблема с вашим JsonResult. Я видел такое же поведение в FireFox, но не в IE.

0 голосов
/ 31 августа 2009

Правильно ли установлены MIME-типы на вашем сервере?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...