Подтвердить что ты не робот

IE пытается загрузить JSON в ASP.NET MVC 3

Я пытался вернуть 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"); в моей другой части и перенаправил json как "text/plain", после чего увидел предупреждение. Но в то время responseJSON.success != false для меня. У вас есть какие-либо предложения по этому поводу?

4b9b3361

Ответ 1

Я решил, что с этим трюком

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

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

Ответ 2

Эта проблема возникает при использовании плагина для загрузки, который использует 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 и соответственно изменять тип контента.

Ответ 4

Я использовал этот же загрузчик и имел ту же проблему.

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

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

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

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

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

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

Edit:

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

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

xhr.send(file)

Я добавил:

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

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

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