我遇到了性能问题,我们将2页设置作为更大系统中工作流程的一部分。本节专门用于呈现允许用户选择自己的参数的报告。
Page1.aspx
收集报告的参数信息。它需要在表单上提交的信息并对其进行验证。如果它验证OK,它将选择作为XML存储在DB中,然后使用查询字符串中的运行ID重定向到Page2.aspx
。很简单,性能很好。
Page2.aspx
从数据库中提取ID并保存Crystal ReportDocument
对象(需要几毫秒),然后我们调用ExportToHttpStream
,然后将报告呈现为PDF或DOC或XLS下载(输出格式在Page1.aspx
中确定)。由于我们的报告编写方式和目标系统上的DB索引,ExportToHttpStream
方法的性能非常差。这是我目前无法控制的,但我承诺他们正在接受工作。
所以问题是,当按下Page1.aspx
中的提交按钮时,用户会在下载开始前经历很长时间的延迟。然后,用户再次按下提交按钮,认为存在问题,这一点很复杂。
我认为我需要做的是Page1.aspx
重定向到Page2.aspx
。 Page2.aspx
应该呈现母版主页和加载div
,并且在保存对话框自动弹出之前,报表应该以某种方式在后台异步渲染,之后我想将加载div更改为a'生成报告,点击此处返回'。
如果这是实现此目的的最佳方法,我如何加载整页,然后异步请求报告?我愿意接受任何建议。
答案 0 :(得分:1)
您可以使用ajax在Page2.aspx
上加载报告,并在处理时显示加载消息。
查看jQuery.load()
方法。这可能是完成您要做的事情的最简单方法。
Page1.aspx
- 收集参数
Page2.aspx
- 报告视图,通过ajax调用Page2Details.aspx
。
答案 1 :(得分:0)
尝试在Page2.aspx
内加载iframe
并使用jQuery显示等待指标并在Page2.aspx
下载后隐藏它
答案 2 :(得分:0)
虽然这两个答案都给了我一些理由去研究正确的方向。我的解决方案包括使用John Culviner的fileDownload
插件来促进类似的解决方案:
jQuery fileDownload by John Culviner
这使我得到了以下页面结构:
Page1.aspx
,收集并验证报告的参数并将其放入Oracle。Page2.aspx
,同时通过查询字符串设置3隐藏div
传入runid(指向数据库中参数的指针)。加载,错误和成功。 此时使用了上述脚本。 jQuery首先设置加载div
可见然后调用插件。该插件动态创建iframe
并从Page3.aspx
下载二进制文件(xls / doc / pdf)。然后它会触发成功回调或失败。成功回调是通过在Page3.aspx
的响应结束时设置的cookie来触发的。
我相信这个插件在jQuery中使用'text/plain'
AJAX调用提到下载,避免了AJAX中没有八位字节流等效的限制。
它可以工作,它不是最干净的解决方案,它不会降低一点,但为我们受控的内部网上的用户提供了极其响应和令人愉悦的用户界面。