MVC中调用SSRS报告返回后如何关闭处理进度指示器?
解决方案
你的场景里默认的表单提交+重定向下载逻辑没有原生的下载完成回调事件,因为浏览器触发文件下载时不会离开当前页面,也不会给前端抛出对应的完成通知,最稳妥低侵入的方案是Cookie轮询法,改动极小即可实现需求:
实现步骤
- 前端提交表单时生成唯一随机标识,同步提交给后端,同时开启加载动画和Cookie轮询逻辑
- 后端处理请求时,先给响应写入携带该标识的Cookie,再返回原有的重定向逻辑
- 前端轮询到对应Cookie后,即可判定下载已经触发,隐藏加载动画并清理临时Cookie和定时器
代码修改示例
前端HTML调整
<!-- 新增隐藏域存储下载标识 --> <input type="hidden" id="downloadToken" name="downloadToken" value="" /> <input id="submitProcessingStandard" type="submit" class="btn btn-info" value="PDF Report as of Date Below" onclick="handleSubmit()" /> <!-- 你的加载GIF容器保持不变 --> <div id="processingStandard" style="display:none;"><img src="loading.gif" alt="处理中"></div>
前端JS逻辑
// 生成随机唯一标识 function generateToken() { return Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2); } // 读取指定Cookie function getCookie(cookieName) { const cookieStr = `; ${document.cookie}`; const cookieArr = cookieStr.split(`; ${cookieName}=`); if (cookieArr.length === 2) return cookieArr.pop().split(';').shift(); } // 提交处理逻辑 function handleSubmit() { const token = generateToken(); $('#downloadToken').val(token); // 显示加载动画 $('#processingStandard').show(); // 每秒轮询Cookie状态 const checkTimer = setInterval(() => { const completeToken = getCookie('downloadComplete'); if (completeToken === token) { // 下载已触发,隐藏动画 $('#processingStandard').hide(); // 清理定时器和临时Cookie clearInterval(checkTimer); document.cookie = 'downloadComplete=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT;'; } }, 1000); }
后端Action调整
public IActionResult PDF(CustomCrimesAndDistricts ccd, string downloadToken) { // 写入下载完成标识Cookie Response.Cookies.Append("downloadComplete", downloadToken, new CookieOptions { Path = "/", Expires = DateTimeOffset.Now.AddMinutes(1) }); // 原有重定向逻辑完全不变 return Redirect("http://xxxxxx/reportserver/Pages/ReportViewer.aspx?%2fDSP%2fDSP&rs:Format=PDF&enddate=" + ccd.EndDate.ToString("MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat)); }
方案说明
这个方案的兼容性极强,不会受SSRS服务跨域限制,对原有业务逻辑的改动也最小。浏览器收到后端返回的重定向响应时,会先接收Set-Cookie写入的标识,再触发下载,前端轮询到对应Cookie就可以停止加载动画,体验非常流畅。
内容的提问来源于stack exchange,提问作者Steve Cross
相关产品推荐
相关产品推荐

