如何防止用户在gridview中多次点击imagebutton开始下载文件.净Webforms
本文关键字:开始 imagebutton 下载 文件 Webforms 用户 何防止 gridview | 更新日期: 2023-09-27 18:16:50
我在gridview中有这样的东西:
<asp:TemplateField>
<ItemStyle />
<ItemTemplate>
<asp:ImageButton ID="btnDownloadHidden" Enabled="false" runat="server"
CommandName="ScaricaDocHidden" style="display:none" CommandArgument='<%#Eval("ID_MODULO") %>' />
<asp:ImageButton ID="btnDownload" Enabled="true" runat="server"
CommandName="ScaricaDoc" OnClientClick="disable()" CommandArgument='<%#Eval("ID_MODULO") %>' />
</ItemTemplate>
和后面的代码:
protected void gridViewa_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{
case "ScaricaDoc":
{
string id_modulo = e.CommandArgument.ToString();
int? id_contratto = contratto.idContratto;
byte[] pdfBytes = recuperaPDF();
Response.ClearContent();
Response.ClearHeaders();
Response.Clear();
MemoryStream ms = new MemoryStream(pdfBytes);
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=doc.pdf");
Response.Buffer = true;
ms.WriteTo(Response.OutputStream);
Response.Flush();
//Page.ClientScript.RegisterStartupScript(this.GetType(), "testsOnPostback", "$(function() { tests(); })", true);
//GridViewRow gvRow = (GridViewRow)(((ImageButton)e.CommandSource).NamingContainer);
//ImageButton img = (ImageButton)gvRow.FindControl("btnScaricaDoc");
//img.Attributes.Clear();
//img.Attributes.Add("display", "block");
Response.End();
Response.Write("<script>window.close();</script>");
break;
}
和这个javascript:
function disable() {
alert('disable');
var btn = $("input[type='image']");
var hdn = $("input[name$='DownloadHidden']");
var btn = $("input[name$='btnDownload']");
btn.css('display', 'none');
hdn.css('display', 'block');
}
function enable() {
alert('enable');
var btn = $("input[type='image']");
var hdn = $("input[name$='DownloadHidden']");
var btn = $("input[name$='btnDownload']");
btn.css('display', 'block');
hdn.css('display', 'none');
}
现在,我必须在哪里执行enable函数才能使其工作?我已经看到了这样的帖子:
如何防止用户点击一个按钮两次?
但我试过了,不工作,也使用返回false;或者UseSubmitBehavior="false",所以我决定使用另一个已经禁用的按钮,正如我在另一篇文章中看到的那样。但我只是不知道如何重新启用它。
更新:
我已经看到这个:文件下载通过调用。ashx页面,所以现在我所有的下载代码都在ashx上,我不需要再回发下载文件,这真的很好,因为整个页面相当重。现在我的javascript是这样的:
function disable() {
var imageBtn = $('.js-image-button');
//WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(imageBtn.attr('name'), "", true, "", "", false, true));
alert('disable');
imageBtn.attr('disabled', true);
window.location = 'DownloadPDF.ashx';
//alert('enable');
//imageBtn.removeAttr('disabled')
}
但是问题仍然存在,有一种方法可以在下载完成时使用javascript启用按钮?
更新2:我看过这个:
http://forums.hexus.net/programming-web-development/91831-javascript-wait-until-page-loaded-proceed-next-action.html:
Javascript -如何检测文档是否已加载(IE 7/Firefox 3)
:
function disable() {
var imageBtn = $('.js-image-button');
//WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(imageBtn.attr('name'), "", true, "", "", false, true));
//alert('disable');
imageBtn.attr('disabled', true);
window.location = 'Components/TabCheckList/DownloadPDF.ashx';
checkLoad();
}
function checkLoad() {
if (document.readyState === "complete") {
var imageBtn = $('.js-image-button');
//alert('enable');
imageBtn.removeAttr('disabled')
} else {
setTimeout('checkLoad()', 1000);
}
}
这也工作与。ashx再次使用WebForm_DoPostBackWithOptions而不是window.location。当文件生成并显示浏览器弹出窗口时,按钮是启用的,而不是在下载完成时,但它已经足够好了!
更新3
它在firefox上不起作用,它总是给我readyState = 'interactive'
我假设你正在做一个post back,并希望防止进一步点击,而文档正在下载?
你可以试着让它更简单一点。留下一个按钮,给它一个你可以选择的类名,我假设在一个网格中,会有多个下载按钮。
你应该能够通过设置disabled属性来禁用click按钮。
示例如下(尝试多次点击按钮):http://jsbin.com/niziko/1/edit?html,js,output
仍然假设这是一个post-back场景,一旦服务器响应客户端,按钮应该重置为正常状态。