IE пытается загрузить JSON в ASP.NET MVC 3 - PullRequest
12 голосов
/ 21 декабря 2011

Я пытался вернуть Json из моего действия, и после этого IE попытался загрузить его и показал мне диалог сохранения. Я проверил его в Firefox, и там он отлично работает.

return Json(new { success = false, message = ex.Message }, "application/json");

В чем причина такого поведения и как я могу решить эту проблему?

После этого в части Javascript я пытаюсь это

 if (responseJSON.success == false) {
                        alert(responseJSON.message);
                        cancel();
                    }

Но IE все равно не показывает предупреждение. Это приносит мне диалог сохранения.

Я попытался изменить "application/json" с помощью "text/plain", и диалоговое окно сохранения исчезло, но я пока не вижу предупреждения. Чего мне не хватает?

EDIT:

Вот мой комплект Javascript, я использую Valums qquploader (ex-Ajaxupload) для загрузки изображений

 var uploader = new qq.FileUploader({
                element: document.getElementById("image-upload"),
                action: '/Home/ImageUpload',
                allowedExtensions: ['jpg', 'png', 'gif'],
                sizeLimlit: 2048,onComplete: function (id, fileName, responseJSON) {
                    if (responseJSON.success == false) {
                        alert(responseJSON.message);
                        cancel();
                    }
                    else {
                         alert("success");
                          //some code here
                        }
                     }
                   });

Я проверил с alert("success"); в своей части else и отправил json как "text/plain", и после этого я увидел предупреждение. Но в то время responseJSON.success != false для меня. У вас есть предложения по этому поводу?

Ответы [ 4 ]

17 голосов
/ 21 декабря 2011

Я решил это с помощью этого трюка

return Json(new { success = false, message = ex.Message }, "text/html");

И теперь это работает.Но может ли кто-нибудь объяснить, почему он работает с text / html и не работает с application / json и text / plain.Первый пытается загрузить JSON, а второй возвращает неопределенные свойства для полей JSON.

8 голосов
/ 22 сентября 2012

Эта проблема возникает при использовании плагина загрузки, который использует iframe для загрузки с IE (проверено на 9.0).

IE устанавливает заголовок Accept: text/html, , application/xhtml+xml, */* и так, когда вы отвечаете с Content-type: application/json предполагается, что это файл (или, по крайней мере, это единственное объяснение, которое я смог найти в Интернете).

Таким образом, чтобы обойти это, вам нужно установить Content-type: text/html или Content-type: text/plain.

Я бы порекомендовал реализовать это с помощью ActionFilter;вместо того, чтобы вручную изменять тип контента, определите IE и составную часть POST и соответственно измените тип контента.

2 голосов
/ 22 декабря 2011

Я использовал тот же самый загрузчик, и у меня была та же проблема.

Это связано с отправленными заголовками запросов.IE нуждается в запросе, чтобы иметь заголовок accept, который указывает json

xhr.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");

Если вы вставите это после этой строки:

xhr.setRequestHeader("Content-Type", "application/octet-stream");

в js-файл (мой называется fileuploader.js), то у вас больше не будет проблемы, и неМне не нужно указывать text / html в вашем возвращении.

ps Я закомментировал строку типа контента, но больше не уверен, почему.Если простое добавление строки подтверждения не работает, попробуйте также закомментировать заголовок типа содержимого.

Редактировать:

Я снова посмотрел свой файл и, похоже, сделал еще одинменять.

Вместо строки:

xhr.send(file)

Я вставил:

var formData = new FormData();
formData.append("image", file);
xhr.send(formData);

Это следует после строки setrequesrheader выше.

Я не уверен, сработает ли это изменение для всех целей, например для загрузки нескольких файлов.Я загружаю только одно изображение для моего использования.

2 голосов
/ 21 декабря 2011

Возможно, вы не устанавливаете правильный тип MIME для содержимого JSON (для IE попробуйте текст / обычный текст)

См .: Какие проблемы могут возникнуть при использовании приложения MIME type / json?

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