2

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

4

3 回答 3

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 库

于 2012-06-29T17:29:16.980 回答
2

大胆猜测:您正在使用jquery.form插件,该插件使您能够使用 AJAX 上传文件,并且您尚未阅读说明以下内容的文档

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

为了解决使用 iframe 模式时脚本和 JSON 响应的挑战,Form Plugin 允许将这些响应嵌入到 textarea 元素中,建议您在与文件上传和旧版本结合使用时对这些响应类型这样做浏览器。但是请注意,如果表单中没有文件输入,则请求使用普通 XHR 提交表单(不是 iframe)。这给你的服务器代码增加了知道什么时候使用 textarea 什么时候不使用的负担。

既然您已经阅读了它,那么如果您希望您的代码在 IE 下运行,正如我在这篇文章中所举例说明的那样,您应该采取相应的措施。

于 2012-06-29T17:31:34.560 回答
1

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

[HttpPost] 
public JsonResult SaveDocument(DocumentModel model, HttpPostedFileBase postedFile)
{
    ...
    return Json(new { success = true, message="ok" }, "application/json; charset=utf-8", JsonRequestBehavior.AllowGet);
}
于 2012-06-29T17:37:07.063 回答