IE想要下载JSON结果.... MVC3

时间:2012-06-29 17:18:51

标签: c# javascript asp.net-mvc-3

我的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结果,并像其他浏览器一样行事?感谢

3 个答案:

答案 0 :(得分:9)

我在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 Library

答案 1 :(得分:2)

狂野猜测:您正在使用jquery.form插件,该插件可让您使用AJAX上传文件,而您尚未阅读documentation,其中说明了以下内容:

  

支持XMLHttpRequest Level 2的浏览器将能够   无缝上传文件,甚至可以在上传时获得进度更新   收益。对于旧版浏览器,使用了后备技术   涉及iframe,因为无法使用。上传文件   XMLHttpRequest对象的第1级implmentntation。这是常见的   后备技术,但它有固有的局限性。 iframe   element用作表单提交操作的目标   表示服务器响应被写入iframe。这可以   如果响应类型是HTML或XML,但如果响应类型不正常   响应类型是脚本或JSON,两者通常都包含   需要在使用实体引用时重复的字符   在HTML标记中找到。

     

在使用时考虑脚本和JSON响应的挑战   在iframe模式下,Form Plugin允许嵌入这些响应   在textarea元素中,建议您这样做   与文件上传和旧版本结合使用时的响应类型   浏览器。但请注意,如果没有文件输入   然后请求使用普通的XHR提交表单(不是   IFRAME)。这会使您的服务器代码负担知道何时使用   一个textarea,什么时候不去。

现在你已经阅读了它,你应该采取相应的行动,如果你希望你的代码在IE下工作,我在this post中举例说明。

答案 2 :(得分:1)

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

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