2

我有以下代码将文件从服务器下载到客户端,单击按钮时会发生这种情况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;

我注意到放置上面的代码(响应)时按钮没有被禁用,因为我在那里有另一个代码并且按钮被它禁用了。所以它必须与响应有关。

编辑:

按钮在 a 内ModalPopupExtender,以防万一。

4

4 回答 4

1

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

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

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

您可以在 Page_Load,f.ex 的代码中使用 Attribute.Add():

btnSavetoDB_ExportToExcel.Attribute.Add("onclick","this.disabled=true")
于 2012-11-12T20:45:53.720 回答
1

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

Page_Load2)如果您想使用写入响应,您可以创建新的 Generate.aspx 页面,在其方法中将文件写入响应。

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);

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

于 2012-11-12T21:21:06.807 回答
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是以毫秒为单位的时间,在此之后按钮将被重新启用。

于 2012-11-12T21:01:17.227 回答
0

我找到了解决问题的方法,归功于:Dave Ward (点击这里)

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

于 2012-11-13T13:50:12.207 回答