我有以下代码从服务器下载文件到客户端,当单击按钮btnSavetoDB_ExportToExcel
时发生,之后我想要禁用按钮,我该如何实现?
string fileName = newFN + ".xlsx";
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.TransmitFile(DestFile);
Response.End();
btnSavetoDB_ExportToExcel.Enabled = false;
我注意到当放置上面的代码(响应)时按钮没有被禁用,因为我在那里有另一个代码并且按钮变得禁用它。所以它必须与响应有关。
修改
如果重要,按钮在ModalPopupExtender
范围内。
答案 0 :(得分:1)
原因是如果您使用服务器代码禁用该按钮,则需要将响应返回到浏览器窗口。
在这里,您将浏览器捕获的流作为文件而不是浏览器窗口返回,以便当前显示永远不会更新。
要解决这个问题,你可以在html本身的按钮上实现一个javascript行。
您可以在Page_Load,f.ex:
的代码中使用Attribute.Add()btnSavetoDB_ExportToExcel.Attribute.Add("onclick","this.disabled=true")
答案 1 :(得分:1)
至少有两种可能的解决方案 1)不是将文件写入响应,而是可以在服务器上的temp目录中生成文件,并为用户提供该文件的链接(或重定向到此链接)。
2)如果要使用写入响应,可以创建新的Generate.aspx页面,该页面将文件写入其Page_Load
方法中的响应。
if (Request.QueryString["ID"] != null)
{
//find file by its ID
...
Response.AddHeader("Content-disposition", "attachment; filename=" + fileName));
Response.ContentType = "application/octet-stream";
Response.WriteFile(fullFileName);
Response.End();
}
在Page_Load
的btnSavetoDB_ExportToExcel页面上添加以下代码:
var script = @"<script language=JavaScript>function Export(fileID)
{
var iframe = document.createElement('iframe');
iframe.src = 'Generate.aspx?ID='+ fileID;
iframe.style.display = 'none';
document.body.appendChild(iframe);
}
</script>";
Page.RegisterStartupScript("Startup", script);
然后只需调用javascript Export
方法将文件发送给用户。
答案 2 :(得分:0)
正如在另一个答案中所提到的,应该在客户端禁用该按钮(因为您在代码中使用Response.End()
,ASP.NET将永远不会使用具有Enabled=False
的按钮呈现页面。
在.aspx文件中添加
<asp:Button ID="btnSavetoDB_ExportToExcel" OnClientClick="this.disabled=true;" [..] />
但是请注意,这可能不是一个好主意 - 如果用户意外地从文件下载窗口点击“取消”该怎么办?
更好的解决方案(了解您希望阻止用户多次单击按钮)是添加计时器以重新启用按钮:
<asp:Button ID="btnSavetoDB_ExportToExcel" OnClientClick="var a=this; a.disabled=true; window.setTimeout(function() { a.disabled=false; }, 5000)" [..] />
值5000
是以毫秒为单位的时间,之后将重新启用该按钮。
答案 3 :(得分:0)
我找到了解决问题的方法,信用证:Dave Ward (click here)
<asp:Button ID="btnSavetoDB_ExportToExcel" runat="server"
OnClientClick="this.disabled = true;"
UseSubmitBehavior="false"
Text="Save results to DB and export to Excel"
onclick="btnSavetoDB_ExportToExcel_Click" />
这就是诀窍:
OnClientClick="this.disabled = true;"
UseSubmitBehavior="false"