我有一个模式对话框,允许用户生成自定义的PDF。在他们点击"开始"按钮后,页面会用window.location重定向到一个控制器,然后控制器创建PDF并返回。
由于返回PDF需要很长时间,我想显示一个模式的"生成PDF"对话框,该对话框在PDF完成并返回后自动关闭。
问题是我不知道如何/何时执行最后一个函数来关闭"生成PDF"对话框。由于控制器返回的是application/pdf类型,因此没有可附加的文档对象事件,对吗?最好的方法是什么?
就是这样做的
-
用户点击链接创建pdf
-
AJAX请求被发送到服务器以生成pdf
-
服务器将pdf创建添加到后台作业,并返回状态为
added
-
客户端接收状态,显示模型或动画,并开始ping服务器每3秒的状态
-
服务器在(n(秒后将状态返回为
completed/failed
,并返回到pdf -
客户端隐藏模型/动画,停止ping并在新选项卡中打开链接下载pdf
感谢您的回复@PGill走在了正确的轨道上。我简化了他的方法:
- 用户单击"开始"按钮
- 显示"生成PDF"模式对话框
- AJAX请求被发送到控制器1以生成PDF
- 控制器1创建PDF(需要5-60秒(,将其存储在安全位置,并返回唯一密钥
- "生成PDF"模式对话框被隐藏
- 浏览器被重定向到控制器2并发送唯一密钥
- 控制器2验证密钥,从安全位置检索PDF,并将其返回
这里的解决方案是将PDF的生成和PDF的下载分为两个步骤,以便在这两个步骤之间隐藏模式对话框。
验证它,从安全位置检索PDF并返回它。
ShowModalDialog();
$.ajax({
type: "GET",
url: 'GeneratePDFReportForDownload?' + params,
success: function (pdfkey, textStatus, jqXHR) {
HideModalDialog();
window.location = 'DownloadPDFReport?key=' + pdfkey;
},
async: true,
datatype: 'json'
});
重定向到一个控制器,该控制器创建并保存pdf文件。保存pdf文件后,控制器应返回一个关闭模态并重定向到另一个控件的js,该控件只读取并响应pdf文件。