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); ...

无需修改那些播放良好的浏览器的响应内容类型(不是 无需记住在您的各种 Ajax 操作方法中使用 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 @Vipul:我觉得你的Task方法有问题,你能把你的代码复制到这里吗?【参考方案4】:

在我的情况下,当响应标头中的 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)

由于 mime 类型不匹配,IE9 脚本响应被阻止

跨域(Cross-Domain) AJAX for IE8 and IE9

js解析与序列化json数据

Java Web返回JSON

跨域获取所有浏览器的 JSON 文件