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)
你可以在 JavaScript 中使用它:
function downloadSpreadsheet(id) {
window.location.href = '@Url.Action("GetSpreadsheet", "Home")?id=' + id;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18943 次 |
| 最近记录: |