在IE(7~10)中下载Json响应
在IE(7~10)中下载Json响应
我正在尝试上传一个文件并返回关于文件属性(名称、大小等)的json响应。在所有浏览器中都正常工作,除了IE。
IE试图将JSON作为文件下载!
我使用的是asp.net mvc4,文件上传操作具有HttpPost属性,并且我使用return Json(myObject);返回json响应。
以下是我的http头:
请求
键值 请求 POST /File/UploadFile/ HTTP/1.1 接受 text/html, application/xhtml+xml, */* 引用 http://localhost:63903/ 接受语言 en-NZ 用户代理 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 内容类型 multipart/form-data; boundary=---------------------------7dc1e71330526 接受编码 gzip, deflate 主机 localhost:63903 内容长度 1377002 DNT 1 连接 Keep-Alive 缓存控制 no-cache
响应
键值
响应 HTTP/1.1 200 OK
服务器 ASP.NET Development Server/11.0.0.0
日期 Tue, 18 Dec 2012 23:44:19 GMT
X-AspNet-Version 4.0.30319
X-AspNetMvc-Version 4.0
缓存控制 private
内容类型 application/json; charset=utf-8
内容长度 154
连接 Close
我尝试了一些建议,但到目前为止还是回到原点!
在使用ASP.NET MVC 3或4的情况下,当IE尝试将Json响应作为文件下载时,只需在视图中添加对jquery.unobtrusive的引用即可解决此问题。例如:.Render("~/Scripts/jquery.unobtrusive-ajax.min.js")
。一旦这个引用添加到视图中,IE就不再尝试从JsonResult控制器动作中下载json响应。无需更改响应类型等等。
我已经将这个文件包含在我的html页面中,但是IE仍然试图下载json响应。有什么帮助吗?我使用的是WebApi 2.0。
问题出现的原因是IE浏览器在尝试下载Json响应时出现问题。解决方法是在视图中添加对jquery.unobtrusive的引用。通过添加这个引用,IE将不再尝试从JsonResult控制器动作中下载json响应。以下是解决方法的具体步骤:
1. 在视图文件中找到需要引用jquery.unobtrusive的位置。
2. 在该位置添加以下代码:.Render("~/Scripts/jquery.unobtrusive-ajax.min.js")
。
3. 保存并重新加载页面。
通过以上步骤,IE浏览器将不再尝试下载Json响应,解决了该问题。
在处理IE(7~10)下载JSON响应的问题时,出现了以下几个解决方法:
1. 将JSON返回为"text/html",因为IE不知道如何处理"application/json"的内容。
return Json(myObject, "text/html");
2. 可以尝试使用"text/x-json",这可能会更正确一些。
return Json(myObject, "text/x-json");
3. 正确且最安全的内容类型实际上是"text/plain"。如果使用"text/html"作为内容类型,并且在JSON属性的值中返回HTML,IE8及更早版本会对响应内容做出奇怪的处理。
4. 当使用"text/html"作为内容类型并使用AjaxOptions
的UpdateTargetId
属性时,如果返回的内容类型是"text/html",它将用返回的JSON替换UpdateTargetId的内容。如果内容类型是"application/json",它将按预期工作。是否有任何方法可以解决这个问题?
5. 我尝试将内容类型更改为"text/plain",但IE8仍然试图下载它,将其设置为"text/html"则可以正常工作。
6. 对我来说,返回"text/plain"在所有浏览器上都有效。只需在另一端使用jQuery期望的JSON即可。
7. 请问您是否能提供一份参考资料(最好是来自Microsoft的)证明"IE不知道如何处理application/json的内容"这个说法?谢谢!
8. 我没有来自Microsoft的参考资料,但如果您在互联网上搜索,您会看到这给很多开发人员带来了很多麻烦。请参考以下链接:
- [stackoverflow.com/questions/17701992/](http://stackoverflow.com/questions/17701992)
- [stackoverflow.com/questions/2483771/](http://stackoverflow.com/questions/2483771%232492211)
- [twittercommunity.com/t/](https://twittercommunity.com/t/json-p-requests-mime-type-to-be-changed-to-application-javascript-instead-of-application-json/7236/2)
9. 您确定这是一个好的解决方法吗?仅仅因为IE有问题就将响应类型更改成不正确的类型。难道真的没有办法告诉IE将JSON显示为文本吗?