这是我为展示我的问题而构建的示例应用。一个aspx页面,上面有以下内容:
<form id="form1" runat="server">
<asp:ScriptManager runat="server" />
<asp:Button runat="server" ID="btnGo" Text="Go" OnClick="btnGo_Click" />
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:TextBox runat="server" ID="txtVal1" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
然后,在后面的代码中,我们有以下内容:
protected void btnGo_Click(object sender, EventArgs e)
{
Thread.Sleep(5000);
Debug.WriteLine(string.Format("{0}: {1}", DateTime.Now.ToString("HH:MM:ss.fffffff"), txtVal1.Text));
txtVal1.Text = "";
}
如果您运行此命令并多次单击“开始”按钮,您将在“输出”窗口中看到多个调试语句,显示已处理多个请求。这似乎与更新面板的记录行为相矛盾(即,如果您在处理时发出请求,则会终止第一个请求并处理当前请求)。
无论如何,重点是我想解决它。显而易见的选择是在第一次按下后使用Javascript来禁用按钮,但这让我觉得难以维护,我们可能在很多屏幕上遇到同样的问题,如果有人重命名按钮,它很容易被破坏。
你有什么建议吗?也许我可以在Global.asax中的BeginRequest中做些什么来检测重复的请求? UpdatePanel上是否有一些设置或功能可以阻止它执行此操作,或者AjaxControlToolkit中可能会阻止它?
答案 0 :(得分:0)
创建一个从asp按钮继承的自定义控件,并具有禁用和启用自身的脚本。波纹管没有经过测试,但却是一个起点。
public class SafeButton : System.Web.UI.WebControls.Button{
public SafeButton()
{
OnClientClick = "javascript to disable this button goes here";
ScriptManager.RegisterStartupScript(this, this.GetType(), "keyforthis", "javascript to enable this button goes here", true);
}
答案 1 :(得分:0)
您可以通过设置(在按钮的标记中)
来阻止用户进行多次点击OnClientClick="this.disabled = true;"
并设置此属性
UseSubmitBehavior="false"
单击此按钮后将禁用该按钮。您不需要启用该按钮,一旦从回发返回它将自动启用。 'UseSubmitBehavior'将关闭默认的提交行为并允许提交,尽管该按钮已被禁用。
上述解决方案仅适用于按钮控件,并且不支持所有平台see MSDN支持的平台。
这将提交表单,如果在10毫秒后页面仍然可用,则按钮\ control将禁用。
编写javascript函数
<script language="javascript" >
function preventMultipleClicks(a){
window.setTimeout(function() { a.disabled=true; }, 10)
return true;
}
</script>
然后在按钮或回发控件的OnClientClick属性中调用它
OnClientClick="preventMultipleClicks(this);"