IE9 JSON 数据“你要打开还是保存这个文件”
Posted
技术标签:
【中文标题】IE9 JSON 数据“你要打开还是保存这个文件”【英文标题】:IE9 JSON Data "do you want to open or save this file" 【发布时间】:2011-07-20 07:42:42 【问题描述】:开始使用 IE9 测试我的 jQuery 应用程序。看来我在这里可能会遇到一些麻烦。 我注意到,当我将 JSON 数据返回给 javascript 方法时,我总是会收到这样的提示:“你想打开还是保存这个文件?”并为我提供了 3 个按钮:打开、保存和取消。当然,我的 javascript 会根据 JSON 对象中设置的值执行操作,但由于 IE9 不会将其传递给脚本,因此我无法从那里执行后续操作。
还有其他人面临这个问题吗?这是一张快照。
【问题讨论】:
什么是 HTTP 标头与来自服务器的 JSON 响应一起发回? 您是否在FF等不同浏览器中尝试过相同的页面?你在 IE 9 中启用了 javascript 吗? 您几乎可以肯定发送了错误的 MIME 内容类型,或者做了一些非常奇怪的事情,例如将 JSON 响应发送回 IFRAME 标记。复制 URL 将使我们能够轻松查看。 (启用与禁用 JS 根本没有区别)。 抱歉延迟回复。我将数据类型设置为“文本 json”。如果我只是将它设置为“json”,它认为它必须执行 jsonp 并通过回调将其返回。这在所有浏览器中都很常见。但是,我的代码适用于 IE8、FF4.0 和新的 Chrome(10?)。我在别处读到这可能与 ttp://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" rel="nofollow" target="_blank">w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 有关。我还为 添加了元标记 实际上,你是对的@EricLaw。在 Json 结果中设置内容类型后,它起作用了。我必须添加以下几行:result.ContentEncoding = System.Text.Encoding.UTF8; result.ContentType = "application/json; charset=UTF-8"; 【参考方案1】:如果有人在使用 ASP.net MVC 并尝试解决此问题 - 我在 MVC 框架 中使用了以下内置方法。只需更新 JsonResult 上的内容类型和编码。
public ActionResult Index(int id)
// Fetch some data
var someData = GetSomeData();
// Return and update content type and encoding
return Json(someData, "text/html", System.Text.Encoding.UTF8,
JsonRequestBehavior.AllowGet);
这为我解决了问题!
【讨论】:
我看到Json
类在 System.Web.Helpers
中,但我收到了 "Method, delegate, or event expected"
消息,它不会构建。偶然知道我错过了什么?
使用这种方法,开发人员必须记住在每次返回 JSON 时将内容类型设置为“text/html”。如果他们忘记了怎么办?不是一个好的解决方案!另外,返回 JSON 数据并告诉浏览器这是 HTML 内容是根本错误的!【参考方案2】:
(最初为this question发布的答案。)
如果使用 MVC,处理此问题的一种方法是实现一个基本控制器,您可以在其中 覆盖(隐藏)Json(object) 方法,如下所示:
public class ExtendedController : Controller
protected new JsonResult Json(object data)
if (!Request.AcceptTypes.Contains("application/json"))
return base.Json(data, "text/plain");
else
return base.Json(data);
现在,您的控制器都可以继承 ExtendedController 并简单地调用 return Json(model);
...
Json(data, "text/plain")
这适用于 json 请求,否则会在 IE8 和 IE9 中显示“打开或保存”消息,例如 jQuery File Upload 发出的消息
【讨论】:
我使用“text/html”而不是“text/plain”,但这可能是由于我在客户端使用的特定实现造成的。只是为有同样问题的人提一下。【参考方案3】:我昨天也遇到了这个问题,WebAPI 返回了一个 URL 列表(异步上传的文件)。
只需将内容类型设置为“text/html”,而不是 WebAPI 服务的默认“application/json; charset=UTF-8”。我得到了 JSON 字符串的响应,然后使用 $.parseJSON 将其转换为 JSON 对象。
public async Task<HttpResponseMessage> Upload()
// ...
var response = Request.CreateResponse(HttpStatusCode.OK, files);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
return response;
// result is an iframe's body content that received response.
$.each($.parseJSON(result.html()), function (i, item)
console.log(item.Url);
);
【讨论】:
感谢有关 webapi 的回复。我有这个确切的问题并且设置 ContentType 有效。我尝试通过 CreateResponse 重载设置“text/html”,但 MVC 抛出一个异常,指出它找不到格式化程序(仅支持 json 和 xml)。 我也面临同样的问题,我尝试了这个解决方案,但它产生了转换错误:无法将类型'System.Net.Http.HttpResponseMessage'隐式转换为'System.Threading.Tasks.Task在我的情况下,当响应标头中的 contentType 为“application/json; charset=UTF-8”时,IE 9 会显示该提示。但改为“text/html”后提示不显示,虽然所有 otter 浏览器都可以使用“application/json; charset=UTF-8”。
【讨论】:
其实IE8也坏了,需要改。【参考方案5】:实际上,@EricLaw 你是对的。在 Json 结果中设置内容类型后,它起作用了。 我必须添加以下几行:
result.ContentEncoding = System.Text.Encoding.UTF8;
result.ContentType = "application/json; charset=UTF-8
【讨论】:
在下面查看我的答案,它应该会有所帮助:***.com/questions/5388893/…以上是关于IE9 JSON 数据“你要打开还是保存这个文件”的主要内容,如果未能解决你的问题,请参考以下文章
ajaxUploadFile在IE9等IE浏览器,上传变json下载的问题解决(SpringMVC + ajaxUploadFile)