IE9 JSON数据“是否要打开或保存此文件”

38

我开始使用IE9测试我的jQuery应用程序,发现可能会遇到一些问题。

我发现当我将JSON数据返回给Javascript方法时,总是会弹出提示框,询问:"您要打开还是保存此文件?",并提供三个按钮: "打开"、"保存"和"取消"。当然,我的javascript根据JSON对象中设置的值执行操作,但由于IE9不会将其传递给脚本,因此我无法执行后续操作。

还有其他人遇到这个问题吗?以下是快照。输入图像描述


3
服务器返回的JSON响应中发送了哪些HTTP头? - BigFatBaby
你尝试在其他浏览器(如FF)中打开同一页面了吗?你在IE 9中启用了JavaScript吗? - Xhalent
你几乎肯定发送了错误的 MIME Content-Type,或者像将 JSON 响应发送回 IFRAME 标记之类的非常奇怪的操作。提供一个可复现的 URL 可以让我们轻松查看。(启用或禁用 JS 没有任何区别)。 - EricLaw
抱歉回复晚了。我将dataType设置为"text json"。如果我只设置为"json",它会认为必须执行jsonp并带有回调返回。这在所有浏览器中都很常见。然而,我的代码可以在IE8、FF4.0和新的Chrome(10?)上运行。我在其他地方读到过这可能与<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">有关。我还添加了一个<meta http-equiv="X-UA-Compatible" content="IE=100">的元标记。 - Anup Marwadi
实际上,@EricLaw,你是对的。在设置Json结果的内容类型后,它起作用了。我不得不添加以下几行代码:result.ContentEncoding = System.Text.Encoding.UTF8; result.ContentType = "application/json; charset=UTF-8"; - Anup Marwadi
5个回答

21

如果有人正在使用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中,但是我收到了一个“需要方法、委托或事件”的错误信息,导致无法构建。不知道我缺少了什么? - atconway
1
采用这种方法,开发人员必须记得每次返回JSON时将内容类型设置为"text/html"。如果他们忘记了怎么办?这不是一个好的解决方案!此外,返回JSON数据并告诉浏览器它是HTML内容是基本错误的! - Mosh

13

如果使用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);”...
  • 对于那些表现良好的浏览器(不包括<=IE9!),无需修改响应内容类型
  • 在各种Ajax操作方法中,无需记住使用“Json(data, "text/plain")

这适用于JSON请求,在IE8和IE9中会出现“打开或保存”消息,例如由jQuery文件上传发出的请求。


1
我在客户端使用的具体实现可能导致了这一点,但我使用了"text/html"而不是"text/plain"。只是提醒其他有同样问题的人。 - Robin van der Knaap

6

昨天我也遇到了这个问题,我的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)。 - John Livermore
我也遇到了同样的问题,我尝试了这个解决方案,但它生成了转换错误:无法隐式转换类型'System.Net.Http.HttpResponseMessage'为 'System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>'。 - Vipul
@Vipul:我认为你的Task方法有问题,能否在这里复制你的代码? - Tien Do

3
在我的情况下,当响应头中的contentType为"application/json; charset=UTF-8"时,IE 9会显示提示。但是如果更改为"text/html",则该提示将不会显示,虽然所有其他浏览器都可以正常处理"application/json; charset=UTF-8"。

实际上,IE8也出现了故障,需要进行更改。 - philw

2

实际上,@EricLaw 你是对的。在设置Json结果的内容类型之后,它可以正常工作。我必须添加以下几行:

 result.ContentEncoding = System.Text.Encoding.UTF8; 
 result.ContentType = "application/json; charset=UTF-8

看看我的回答,应该会有帮助:https://dev59.com/Xm435IYBdhLWcg3wfQF9#15911008 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接