我有一个网页,它返回一组结果,然后您可以以.csv格式请求。
由于文件的创建时间非常长(有时长达30分钟),我添加了一些JavaScript,它将一个类添加到div,以便它覆盖屏幕,告诉用户正在创建报告,耐心等待。
创建并下载文件后,我希望div返回原来不存在的状态(可以这么说)。
这是我现在拥有的。
的JavaScript
function skm_LockScreen() {
var lock = document.getElementById('ctl00_ContentPlaceHolder1_skm_LockPane');
var lock2 = document.getElementById('ctl00_ContentPlaceHolder1_pleaseWait');
if (lock)
lock.className = 'LockOn';
if (lock2)
lock2.className = 'WaitingOn';
}
function skm_UnLockScreen() {
var lock = document.getElementById('ctl00_ContentPlaceHolder1_skm_LockPane');
var lock2 = document.getElementById('ctl00_ContentPlaceHolder1_pleaseWait');
if (lock)
lock.className = 'LockOff';
if (lock2)
lock2.className = 'WaitingOff';
}
按钮
<asp:Button ID="LatestReportButton" runat="server" CssClass="standardButton" Text="Latest Quote Report" Width="140px"
OnClick="ReportButton_Click" CommandArgument="2" OnClientClick="skm_LockScreen()" />
背后的代码
protected void ReportButton_Click(object sender, EventArgs e)
{
Page.ClientScript.RegisterStartupScript(base.GetType(), "unlock", "<script type=\"text/javascript\">skm_UnLockScreen();</script>");
try
{
//Start creating the file
using (StreamWriter sw = new StreamWriter(tempDest + "\\" + csvGuid + ".csv", true))
{
//Code to create the file goes
}
}
catch
{
}
Response.AddHeader("Content-disposition", "attachment; filename=report.csv");
Response.ContentType = "application/octet-stream";
Response.WriteFile("CreatedReport.csv");
Response.End();
}
我遇到的问题是,由于Response.End(),JavaScript永远不会写回页面。
我已经将它作为两个按钮完成,一个用于创建报告,另一个用于下载,但我的公司更喜欢将它们集中在一起。
有什么建议吗?
答案 0 :(得分:0)
考虑到生成报告所需的时间长度,您提出的方法包含许多固有风险,每个风险都会导致报告创建失败:
我会以不同的方式解决这个问题。在第一个例子中,我将查看是否可以优化报告生成 - “30分钟”立即敲响警钟。假设数据库在某些时候涉及,我将至少调查以下内容:
如果这不是一个选项(让我们假设您无法出于任何原因修改数据库),我仍然会考虑一种完全不同的方法来生成报告,从而将报告创建逻辑移到Web应用程序之外比如,一个控制台应用程序。
为此,您需要定义:
一些数据库表应足以记录此信息。