我希望我不会重新发布同样的问题,因为我认为这是非常常见的问题,是的,我已经搜索了这个论坛,找到了一些建议,但它们对我没有用。
我正在尝试使用MVC& amp; jQuery的。我有一个按钮,当我点击按钮时我想下载一个文件而不刷新当前视图。如果有任何错误,我想在警报中显示该错误。按钮的onClick()
事件配置为Download()
功能。
这是我的代码
<button onclick="Download(123);">Download</button>
function Download(fileID) {
window.location = "/Users/MyController/DownloadFile?fileID="+ fileID;
}
以上功能有效。我看到一个下载弹出窗口。但是,如果连接到url时出错,或者服务器上的控制器内部存在异常,该怎么办?在这种情况下,我想显示带有错误消息的警报。所以我想到使用jQuery ajax,我可以处理成功和错误事件。所以我改变我的JavaScript函数以使用如下的AJAX调用,但它不起作用。它调用服务器,我看到控制器被执行了。但是我没有看到下载弹出窗口。
function Download(fileID) {
var dataToPost = { fileID: fileID};
$.ajax({
type: 'POST',
data: JSON.stringify(dataToPost),
url: "/Users/MyController/DownloadFile",
contentType: 'application/json; charset=utf-8',
success: function (result) {
// I don’t want to set window.location here because this event gets fired AFTER server call. So setting it here will make one more server call to download file.
},
error: function (xhr, ajaxOptions, thrownError) {
// How do I get the exception message here?
}
})
控制器代码
public ActionResult DownloadFile(int fileID) {
try {
var filePath = GetFilePath(fileID);
var fp = new FilePathResult(filePath, "application/octet-stream");
fp.FileDownloadName = "test.xlsx";
return fp;
} catch (FileNotFoundException ex) {
throw new Exception("Cound not file requested file.");
} catch (Exception ex) {
throw new Exception("There is a problem downloading file");
}
}
答案 0 :(得分:1)
很遗憾,您无法使用$ .ajax下载文件,这是HTML / JavaScript的限制。然而,有一些黑客涉及将文件下载到隐藏的iframe中并使用cookie来跟踪它是否下载以模拟AJAX。就个人而言,我使用jQuery插件,http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/该网页也对其所做的事情(使用iframe和cookie)做了非常好的解释。这个插件为您提供处理程序,因此您可以显示类似&#34的消息;下载已开始&#34;什么时候开始,还有成功和失败的处理程序。您当然可以自己实现隐藏的iframe逻辑,我发现这个插件非常容易使用。
该页面上有一个示例,展示了如何在MVC中设置cookie。