我试图从我的动作中返回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"
并保存对话框消失,但我还无法看到提醒。我错过了什么?
修改
这是我的complect 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
对我来说。你有什么建议吗?
答案 0 :(得分:17)
我用这个技巧解决了这个问题
return Json(new { success = false, message = ex.Message }, "text/html");
现在它有效。但我可以解释为什么它适用于text / html,并且不能与application / json和text / plain一起使用。首先是尝试下载JSON,其次是返回JSON字段的未定义属性。
答案 1 :(得分:8)
使用上传插件使用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 :(得分:2)
可能你没有为你的json内容设置正确的mime类型(对于IE试试text / plain)
请参阅:What problems may using the MIME type application/json cause?
答案 3 :(得分:2)
我使用的是同样的上传器并遇到了同样的问题。
它与发送的请求标头有关。 IE需要请求有一个表示json的接受标头。
xhr.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");
如果您在此行之后插入此内容:
xhr.setRequestHeader("Content-Type", "application/octet-stream");
在js文件中(我的名字叫做fileuploader.js),你应该不再有问题,也不需要在回复中指明text / html。
P.S。 我注释掉了内容类型行,但我不再确定原因。如果仅添加此接受行不起作用,请尝试注释掉内容类型标题。
编辑:
我再次查看了我的文件,似乎也进行了另一次更改。
而不是行:
xhr.send(file)
我投入:
var formData = new FormData();
formData.append("image", file);
xhr.send(formData);
这是在上面的setrequesrheader行之后。
我不确定此更改是否适用于所有用途,例如多个文件上传。我只上传了一张图片供我使用。