IE想要下载JSON结果…… MVC3

我的MVC3应用程序将文档从用户上传到我们的服务器。 我返回一个JsonResult来显示任何错误,如果有的话:

[HttpPost] public JsonResult SaveDocument(DocumentModel model, HttpPostedFileBase postedFile) { //my wonderful code return Json(new { success = true, message="ok" }); } 

以下是我如何提交请求:

  var isSubmitting = false; var addDocumentOptions = { beforeSubmit: beforeAddDocumentSubmit, // pre-submit callback success: afterDocumentSubmit // post-submit callback }; $('#btnCreateDocument').click(function (e) { e.preventDefault(); $('#divError').html(''); if (!isSubmitting) { $('#createDocForm').submit(); } }); 

上传完成后,此javascript函数将运行:

  function afterDocumentSubmit(responseText, statusText, xhr, $form) { if (responseText.success) { //no errors } else { $('#divError').html('Error: ' + responseText.message); } } 

在FF,Chrome等中,我的javascript代码运行正常,但在IE中,浏览器希望将Json结果下载为文本。 我得到一个不应出现的下载/打开文件对话框。 如何使IE不下载我的Json结果,并像其他浏览器一样? 谢谢

我在Java上的Spring MVC中遇到了类似的问题。 问题是Spring将JSON结果的内容类型作为application/json ,这似乎使IE想要下载它。 您可以尝试将内容类型更改为text/plain ; 在这种情况下,IE不会提示您下载文件。 我怀疑这里可能会发生类似的事情。

你可以尝试:

 return Json(new { success = true, message = "ok" }, "text/plain"); 

为了解决您的新问题:问题是responseText只是一个字符串。 您需要做的是将其转换为Javascript对象。 你可以这样做:

 var response = JSON.parse(responseText); if(response.success) { ... } 

大多数浏览器都支持JSON.parse() 。 如果您遇到与不兼容的浏览器有关的问题,您可以随时使用JSON Javascript库 。

猜测:您正在使用jquery.form插件,它允许您使用AJAX上传文件,而您还没有阅读说明以下内容的文档 :

支持XMLHttpRequest Level 2的浏览器将能够无缝上传文件,甚至可以在上传过程中获得进度更新。 对于较旧的浏览器,使用了涉及iframe的回退技术,因为无法使用XMLHttpRequest对象的1级implmentntation上传文件。 这是一种常见的后备技术,但它具有固有的局限性。 iframe元素用作表单提交操作的目标,这意味着服务器响应被写入iframe。 如果响应类型是HTML或XML,则这很好,但如果响应类型是脚本或JSON,则这两种方法都不起作用,这两种方法通常都包含在HTML标记中找到时需要使用实体引用来重复的字符。

为了解决使用iframe模式时脚本和JSON响应的挑战,Form Plugin允许将这些响应嵌入到textarea元素中,建议您在与文件上载和更早版本结合使用时对这些响应类型执行此操作。浏览器。 但请注意,如果表单中没有文件输入,则请求使用普通XHR提交表单(而不是iframe)。 这会给您的服务器代码带来负担,以便知道何时使用textarea以及何时不使用。

现在您已经阅读过它,如果您希望您的代码在IE下工作,您应该采取相应的操作,正如我在本文中所示 。

正确的JsonResult返回应如下所示:

 [HttpPost] public JsonResult SaveDocument(DocumentModel model, HttpPostedFileBase postedFile) { ... return Json(new { success = true, message="ok" }, "application/json; charset=utf-8", JsonRequestBehavior.AllowGet); }