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
для меня. У вас есть какие-либо предложения по этому поводу?
Ответы
Ответ 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 и соответственно изменять тип контента.
Ответ 3
Возможно, вы не задаете правильный тип mime для своего json-контента (для IE try text/plain)
Смотрите: Какие проблемы могут возникнуть при использовании приложения MIME-типа/json?
Ответ 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 выше.
Я не уверен, что это изменение будет работать для всех целей, например, для загрузки нескольких файлов. Я загружаю только одно изображение для моего использования.