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

我正在从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); }); 

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

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

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

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

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

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

  

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

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

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

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

 jQuery.download(url, data, method) 

您可以在JavaScript中使用它:

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