【问题标题】:IE wants to download JSON result....MVC3IE 想下载 JSON 结果....MVC3
【发布时间】:2023-03-30 08:28:01
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 我说得太早了……现在我的 Json 响应返回 false,即使它被设置为 true。所以我的 div 正在加载,但 responseText.message 是“未定义”
  • 那是因为responseText 只是文本。您需要将其转换为 JSON。编辑我的答案。
  • 这听起来可能很疯狂,但我在我的应用程序的另一个区域执行此操作。唯一的区别是,我上传的文件添加了 HttpPostedFileBase 类型的参数。有效的没有额外的参数
  • 有趣。我对 C# 和 ASP.NET MVC 不太熟悉,所以我不确定使用 HttpPostedFileBase 的含义。您是否尝试过我建议的更改?
  • 我做了...应用程序就在那里。所以我不知道它在做什么......加上 json.js 文件的大小是 19k
【解决方案2】:

猜想:您正在使用jquery.form 插件,该插件使您能够使用AJAX 上传文件,而您尚未阅读documentation,其中声明如下:

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

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

现在您已经阅读了它,如果您希望您的代码在 IE 下运行,您应该采取相应的措施,正如我在 this post 中所举例说明的那样。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我试过这个,但现在我的 Json 响应返回 false,即使它被设置为 true。所以我的 div 正在加载,但 responseText.message 是“未定义”
    • 查看 Darin 关于尝试通过 Ajax 上传的回答。如果您不使用该插件,则无法通过 Ajax 上传。另外,我建议你对 Chrome 开发工具、Fiddler 和 Firebug 超级友好
    • 这将真正强制 json 作为应用程序,因此 IE 将下载它而不是作为文本应用/返回它。
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2012-12-06
    • 2014-03-04
    相关资源
    最近更新 更多