下载文件asp.net后禁用按钮不起作用

时间:2012-11-12 20:34:33

标签: c# asp.net

我有以下代码从服务器下载文件到客户端,当单击按钮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范围内。

4 个答案:

答案 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"