如何使用MVC&amp ;;下载文件jQuery的

时间:2015-04-24 19:53:49

标签: jquery asp.net-mvc downloadfile downloadfileasync

我希望我不会重新发布同样的问题,因为我认为这是非常常见的问题,是的,我已经搜索了这个论坛,找到了一些建议,但它们对我没有用。

我正在尝试使用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");
        }
}

1 个答案:

答案 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。