要求:
我们有UI,用户可以从服务器下载文件。在此页面上,我们还有一个字符串,表示来自服务器的下载最近下载时间。
文件(.csv)可以包含一到多个记录,因此未预定义下载时间。
问题:
我们基本上既需要文件也需要下载时间。我不能同时从控制器动作返回多个返回,即FileResult和RedirectToAction()。
已尝试解决方案:
1. jQuery promises(When()
),但jQuery函数在服务器调用开始之前执行。
2.在下载名单按钮单击后5秒或任何预定义时间刷新页面。但是如果文件下载需要更多时间,那么页面会更早刷新,并且下载名册调用会自动被杀死。
3.我尝试过Ajax,但是Ajax不支持MVC中的FileResult返回类型。
以下是来自控制器,视图和脚本的代码供您参考。
控制器:
public ActionResult DownloadCompleteRoster()
{
var rosterResponse = _rosterService.SaveCompleteRoster(User.EmployerId, User.UserId);
if (rosterResponse.IsSuccess)
{
return File(new UTF8Encoding().GetBytes(rosterResponse.RosterFile.ToString()), "text/csv", rosterResponse.FileName);
}
TempData["ErrorMessage"] = rosterResponse.ErrorMessage;
return RedirectToAction("Dashboard");
}
查看:
<div>
<a href="#" id="downloadCompleteRoster" class="btn secondary mt10">Download Roster File</a>
@if (Model.LastCompleteDownloadDate != null)
{
<span class="small lastDownloaded"><em><strong>Last Downloaded:</strong> @string.Format("{0:MM/dd/yyyy hh:mm:ss tt}", Model.LastCompleteDownloadDate)</em></span>
}
</div>
<script>
var urlDownloadCompleteRoster = '@Url.Action("DownloadCompleteRoster", "Admin")';
</script>
JQuery脚本:
$("#downloadCompleteRoster").click(function () {
DownloadCompleteRoster();
});
//download complete roster csv file
function DownloadCompleteRoster() {
window.location.href = urlDownloadCompleteRoster;
}