我有一个返回文件的后端API方法(ASP.NET MVC):
[HttpPost]
public ActionResult GenerateReport(string param1, string param2)
{
try
{
string fn = SomeMethodThatGenerateAnExcelFileAndReturnItsFullPath(param1, param2);
return File(fn, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", Path.GetFileName(fn));
}
catch (Exception e)
{
log.Error(e);
throw;
}
}
我在前端有一张表格:
<form id="genForm" action="@Url.Action("GenerateReport", "Report")" method="POST">
<div class="card border-primary">
<div class="card-header">Report parameters</div>
<div class="card-body">
<div class="dx-fieldset">
<!-- inputs and params -->
<div class="dx-field">
<div class="dx-field-label"></div>
<button class="dx-field-value" id="btn-generate"></button>
</div>
</div>
</div>
</div>
</form>
提交表单的javascript事件:
<script type="text/javascript">
$("#btn-generate").click(function() {
// some other modifications
$("#genForm").submit();
})
</script>
当我点击生成按钮时,使用此代码向服务器发送请求(页面刷新)并下载文件(下载完成后页面停止刷新)。虽然正在加载发布和下载浏览器,但页面的DOM在之后不会改变。
我的问题是,由于DOM没有改变,如何捕获和处理“提交后”事件(实际上是在下载完成时)。
谢谢。
答案 0 :(得分:0)
我过去使用过的技巧是使用cookie来表明下载是否已经完成。
以下是我过去的做法:
创建一个iframe作为提交的目标;这只是为了捕获“加载”事件以检查cookie。
捕获该iframe上的load事件以检查cookie ...当cookie存在时,您知道下载已完成。 (更重要的是,cookie的价值可以为您提供更多信息)
提交请求
,删除iframe并根据需要运行其他代码。
我一直使用iframe,但这也适用于window.open()。