使用UpdatePanel时多个并发回发

时间:2009-12-08 12:21:04

标签: javascript asp.net ajax asp.net-ajax updatepanel

这是我为展示我的问题而构建的示例应用。一个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中可能会阻止它?

2 个答案:

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