Asp.net Asp:赢得进展';从ashx文件下载文件时,t结束操作
我试图使用asp:progress,所以当我点击我的asp:button时,它会调用一个ashx文件,该文件会写入CSV响应 到目前为止,当我点击按钮,动画显示正确,下载开始。但是,当文件开始下载时(当我从ashx文件得到响应时),我似乎无法停止动画 以下是aspx:Asp.net Asp:赢得进展';从ashx文件下载文件时,t结束操作,asp.net,updatepanel,updateprogress,Asp.net,Updatepanel,Updateprogress,我试图使用asp:progress,所以当我点击我的asp:button时,它会调用一个ashx文件,该文件会写入CSV响应 到目前为止,当我点击按钮,动画显示正确,下载开始。但是,当文件开始下载时(当我从ashx文件得到响应时),我似乎无法停止动画 以下是aspx: <asp:Content ID="Content2" ContentPlaceHolderID="MainPlaceHolder" runat="server"> <asp:ScriptManager ID="
<asp:Content ID="Content2" ContentPlaceHolderID="MainPlaceHolder" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<p>Download a CSV file</p>
<asp:Button ID="Button2" runat="server" Text="Download"
CausesValidation="False" onclick="Button2_Click" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" AssociatedUpdatePanelID="UpdatePanel1" runat="server">
<ProgressTemplate>
<div id="AlertDiv" style="background:White">
<asp:Image ID="imgLoading" runat="server" ImageUrl="css/smoothness/images/animated-overlay.gif" Width="34px" />Loading...
</div>
</ProgressTemplate>
</asp:UpdateProgress>
</asp:Content>
下面是ashx文件中的ProcessRequest函数:
public void ProcessRequest(HttpContext context)
{
string attachment = String.Format("attachment; filename=Hierarchie des produits au {0}.csv", DateTime.Today.ToShortDateString());
context.Response.AddHeader("content-disposition", attachment);
context.Response.ContentType = "text/csv";
context.Response.AddHeader("Pragma", "public");
context.Response.ContentEncoding = Encoding.GetEncoding(1252);
context.Response.Write(DemandeTarifImageBLL.DataTableToCSVString());
}
我曾尝试使用javascript和PageRequestManager类的属性endRequest、beginRequest和initializeRequest事件(我找到了一些conde代码片段),但到目前为止没有任何效果
下载开始时,我如何强制动画停止?虽然我无法尝试查看它是否工作,但根据我以前的经验,我可以提出以下建议。尝试按以下方式更改代码:
public void ProcessRequest(HttpContext context)
{
string attachment = String.Format("attachment; filename=Hierarchie des produits au {0}.csv",
DateTime.Today.ToShortDateString());
context.Response.AddHeader("content-disposition", attachment);
context.Response.ContentType = "text/csv";
context.Response.AddHeader("Pragma", "public");
context.Response.ContentEncoding = Encoding.GetEncoding(1252);
context.Response.Write(DemandeTarifImageBLL.DataTableToCSVString());
context.Response.Flush();
context.Response.End();
}
添加Flush和End将清除缓冲区并分别标记响应结束。这样,客户机将得出一个明确的结论,即请求已被完全处理
您还可以使用客户端脚本控制更新进度,以下是示例代码:
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(EndRequest);
function EndRequest(sender, args) {
if (postBackElement.id == 'Panel1Trigger') {
$get('UpdateProgress1').style.display = 'none';
}
}
上面的js代码为update panels end request事件添加了一个处理程序,并在函数上关闭更新进度
尝试将处理程序的ProcessRequest函数的内容放入button click事件,并记住为响应添加Flush()和End函数
编辑1:
在进一步查看stack overflow时,我发现以下与您的问题类似的链接,这证实了我的假设,即您不能在更新面板中进行重定向:
希望这有帮助。尝试从javascript重定向到ashx
ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "downloadFileExport", "javascript:window.location ='" + ResolveUrl(downloadUrl) + "';", true)
这也解决了我的问题。在我的ASP.Net Web表单应用程序中,即使进程完成,进度文本仍会持续显示。我能够在开发环境中通过增加ScriptManager中的超时来解决这个问题。下面的例子
不幸的是,这并没有改变结果。动画开始>下载开始>下载完成后动画仍保留我已更新我的答案,我认为这将解决您的问题。这是我尝试过的事情之一,但我不明白为什么EndRequest似乎从未被调用(我在其中放置了一个从未弹出的警报)。我觉得response.redirect应该在客户端结束javascript的执行,但我无法克服这个问题。您应该尝试将您的句柄的ProcessRequest函数的内容放到按钮单击事件中。记住为响应添加Flush()和End函数。你尝试过我建议的更改吗?@ShashankChaturvedi是的,到目前为止运气不好。我忍不住认为这是因为响应而发生的。单击按钮重定向激发。您是否尝试将ProcessRequest(ProcessRequest处理程序的功能)的内容移动到按钮单击(并删除响应.重定向)。我已更新了我的答案,请参考相同的答案。
ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "downloadFileExport", "javascript:window.location ='" + ResolveUrl(downloadUrl) + "';", true)