6

我正在从 MVC 3 网站生成 CSV 并使用 FileContentResult 将其传递给用户。这很好用,但生成 csv 需要 30 秒,因此需要 30 秒才能提示用户保存。

    public virtual FileContentResult GetSpreadsheet(string id)
    {
        var service = new SpreadsheetService();
        var result = service.GetCSV();
        return File(new System.Text.UTF8Encoding().GetBytes(result.Message), "text/csv", "Report123.csv");
    }

所以我想我只是通过 JQuery 调用它——但这(毫不奇怪!)只是将 CSV 转储到页面。

            $.post("/Home/GetSpreadsheet/" + id, null, function (data) {
                $('#resultDiv').html(data);
            });

有谁知道我将如何生成提示保存现在我已经取回了数据?谢谢

4

3 回答 3

12

你不能那样做。把它给忘了。使用 AJAX 下载文件是不可能的。事实上,AJAX 调用将起作用,您将访问服务器,服务器将文件内容发送回客户端,将触发 AJAX 成功回调并将文件内容作为参数传递,这就是一切结束的地方。使用 javascript,由于绝对明显的原因,您不能将文件直接保存到客户端计算机,并且您不能提示“另存为”对话框。

因此,不要使用 AJAX,而是简单地创建一个锚点:

@Html.ActionLink("download spreadsheet", "GetSpreadsheet", new { id = "123" })

现在,如果服务器将Content-Disposition标头设置attachment为浏览器,则会提示用户下载文件并将其保存在计算机上的某个选定位置。

于 2012-03-22T12:05:36.590 回答
11

如果您不想使用锚点,请使用隐藏的 iframe,并将 iframe 的 src 设置为要下载的文件的 url。

<iframe id="hiddenFrame" src="" style="display:none; visibility:hidden;"></iframe>

而不是 '$.post(...)' 行使用:

 downloadSpreadsheet('123');

 function downloadSpreadsheet(id) {
    var url = '@Url.Content("~/YourControllerName/GetSpreadsheet")' + "?id=" + id;
    $('#hiddenFrame').attr('src', url);
}

或者您可以尝试使用jQuery Plugin for Requesting Ajax-like File Downloads

使用插件,您可以通过调用下载:

jQuery.download(url, data, method)
于 2012-04-07T12:23:33.543 回答
6

您可以在 JavaScript 中使用它:

function downloadSpreadsheet(id) {
    window.location.href = '@Url.Action("GetSpreadsheet", "Home")?id=' + id;
}
于 2015-03-11T04:44:53.160 回答