IE尝试在ASP中下载JSON。 NET MVC 3

时间:2011-12-21 15:11:23

标签: javascript asp.net-mvc 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"并保存对话框消失,但我还无法看到提醒。我错过了什么?

修改

这是我的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对我来说。你有什么建议吗?

4 个答案:

答案 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/htmlContent-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行之后。

我不确定此更改是否适用于所有用途,例如多个文件上传。我只上传了一张图片供我使用。