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