如何通过Jquery调用MVC FileContentResult并让它提示用户保存它的返回值?

And*_*rke 4 model-view-controller jquery filecontentresult asp.net-mvc-3

我正在从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");
    }
Run Code Online (Sandbox Code Playgroud)

所以我以为我只是通过JQuery调用它 - 但这(不出所料!)只是将CSV转储到页面.

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

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

Dar*_*rov 12

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

因此,不要使用AJAX,只需创建一个锚点:

@Html.ActionLink("download spreadsheet", "GetSpreadsheet", new { id = "123" })
Run Code Online (Sandbox Code Playgroud)

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


Kib*_*ria 11

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

<iframe id="hiddenFrame" src="" style="display:none; visibility:hidden;"></iframe>
Run Code Online (Sandbox Code Playgroud)

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

 downloadSpreadsheet('123');

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

或者您可以尝试使用jQuery插件来请求类似Ajax的文件下载

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

jQuery.download(url, data, method)
Run Code Online (Sandbox Code Playgroud)


vap*_*guy 5

你可以在 JavaScript 中使用它:

function downloadSpreadsheet(id) {
    window.location.href = '@Url.Action("GetSpreadsheet", "Home")?id=' + id;
}
Run Code Online (Sandbox Code Playgroud)