C# 下载文件asp.net后禁用按钮不工作

C# 下载文件asp.net后禁用按钮不工作,c#,asp.net,C#,Asp.net,我有以下代码将文件从服务器下载到客户端,当单击按钮btnSavetoDB\u ExportToExcel时会发生这种情况,之后我想禁用按钮,我如何实现这一点 string fileName = newFN + ".xlsx"; Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.Add

我有以下代码将文件从服务器下载到客户端,当单击按钮
btnSavetoDB\u 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;
我注意到,当放置上面的代码(响应)时,按钮没有变为禁用,因为我在那里有另一个代码,按钮也随之变为禁用。所以这一定与反应有关

编辑:


该按钮位于ModalPopupXtender中,以备不时之需。

原因是,如果使用服务器代码禁用该按钮,则需要将响应返回到浏览器窗口

在这里,您将返回一个由浏览器捕获为文件的流,而不是返回到浏览器窗口,因此当前显示永远不会更新

为了解决这个问题,您可以在html本身的按钮上实现javascript行

您可以在第页的代码中使用Attribute.Add(),例如:

btnSavetoDB_ExportToExcel.Attribute.Add("onclick","this.disabled=true")

正如在另一个答案中提到的,应该在客户端禁用该按钮(因为您在代码中使用了
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
是按钮重新启用后的时间,单位为毫秒。

至少有两种可能的解决方案。
1) 您可以在服务器的temp目录中生成文件,并向用户提供指向该文件的链接(或重定向到此链接),而不是将文件写入响应

2) 如果要使用写入响应,可以创建新的Generate.aspx页面,在其
page\u 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();
}
在使用btnSavetoDB_ExportToExcel的页面上,在
page_Load
中添加以下代码:

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);
var script=@“函数导出(fileID)
{
var iframe=document.createElement('iframe');
iframe.src='Generate.aspx?ID='+fileID;
iframe.style.display='none';
document.body.appendChild(iframe);
}
";
Page.RegisterStartupScript(“启动”,脚本);

然后只需调用javascript
Export
方法将文件发送给用户。

我已经找到了解决问题的方法,归功于:Dave Ward


这就是诀窍:
OnClientClick=“this.disabled=true;”

使用submitbehavior=“false”

注意您在内容处置头中指定的文件名。如果该值包含逗号,某些浏览器将不喜欢它。最好对文件名进行编码或用引号括起来。区别在于javascript在单击之前安装在按钮上,因此在单击之前可以使用。。当您单击该按钮时,它将在下次回发之前被禁用。您的解决方案在这里遇到问题,因为我在
ModalPopupXtender
中有该按钮。我无法禁用按钮:(在这种情况下,请检查扩展上的OnOkScript属性。当我添加OnClientClick代码时,按钮变为禁用,但不会执行任何代码):(嗨,Alexander,你的第一个方法就是我所做的,但是单击按钮时如何重定向到文件的链接?正如你所看到的,我有文件路径。你是否尝试过将用户重定向到文件?
Response.redirect(http://yoursite.com/generated/f7401466-40ac-4150-b45a-9fa9dc40a9d8/file.xlsx)
?好的,我现在可以通过
响应下载文件。重定向
,但按钮保持启用状态,在此之后它不会被禁用:(如果禁用按钮然后重定向呢?然后尝试使用第二种方法:)。但是,第一种方法也应该有效。
<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" />