2012-06-29 26 views
1

我的MVC3应用程序将文件从用户上传到我们的服务器。我返回JsonResult显示任何错误,如果有的话:IE想要下载JSON结果.... MVC3

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

+0

哪个版本的IE? – MNGwinn

+0

7,8和9 ...... – BoundForGlory

+0

您可以发布实际处理提交并启动Ajax请求的代码吗?而且,如果你使用Ajax提交表单,你的[[submit]事件](http://api.jquery.com/event.preventDefault/)是否会阻止默认动作(http:// api .jquery.com /提交/)? –

回答

8

我遇到了一个类似的问题,在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

+0

我说得太快了......现在我的Json响应返回false,即使它的被设置为true。所以我的div被加载,但responseText.message是'undefined' – BoundForGlory

+0

这是因为'responseText'只是文本。您需要将其转换为JSON。编辑我的答案。 –

+0

这听起来很疯狂,但我在我的应用程序的另一个区域做这个。唯一的区别是,即时通讯上传一个文件,添加一个类型为HttpPostedFileBase的参数。工作的人没有额外的参数 – BoundForGlory

1

胡乱猜测:您正在使用的jquery.form插件,它允许你上传使用AJAX的文件和你没有看过的documentation其中规定了以下内容:支持XMLHttpRequest的2级就能

浏览器到 可以无缝上传文件,甚至可以在上传 前进时获得进度更新。对于旧版浏览器,使用回退技术,其中 涉及iframe,因为不可能使用XMLHttpRequest对象的第1级实现上载文件。这是常见的 后备技术,但它有固有的局限性。 iframe 元素用作表单提交操作的目标,其中 表示将服务器响应写入iframe。如果响应类型是HTML或XML,但是如果 响应类型是脚本或JSON,这两个都很好,但两者通常都包含 字符,如果在HTML中找到 ,则需要使用实体引用来重复使用该字符,这是行不通的 标记。

要使用 当IFRAME模式占脚本和JSON响应的困难,这个插件可以让这些反应被嵌入在textarea元素 ,建议您使用时,这些 响应类型这么做结合文件上传和较旧的浏览器。但请注意,如果 表单中没有文件输入,则请求将使用正常的XHR来提交表单(不是 iframe)。这会让服务器代码的负担知道何时使用 textarea以及何时不使用。

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

1

正确JsonResult回报应该像这样:

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

我试过这个,但现在我的Json响应返回false,即使它被设置为true。所以我的div被加载,但responseText.message是'undefined' – BoundForGlory

+0

请参阅Darin关于试图通过Ajax上传的答案。如果您不使用该插件,则无法通过Ajax进行上传。另外,我建议你使用Chrome开发工具,Fiddler和Firebug –

+0

,这会真正强制json作为应用程序,因此IE会下载它,而不是将它作为文本应用/返回。 – AceMark