Voici un exemple d'application que j'ai construit pour démontrer mon problème. Une seule page aspx avec les éléments suivants :
<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>
Ensuite, dans le code derrière, nous avons ce qui suit :
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 = "";
}
Si vous l'exécutez et cliquez plusieurs fois sur le bouton "Go", vous verrez plusieurs déclarations de débogage dans la fenêtre "Output" indiquant que plusieurs demandes ont été traitées. Cela semble contredire le comportement documenté des panneaux de mise à jour (c'est-à-dire que si vous faites une demande pendant qu'une autre est en cours de traitement, la première demande est terminée et la demande en cours est traitée).
Bref, le fait est que je veux réparer ça. L'option évidente serait d'utiliser Javascript pour désactiver le bouton après la première pression, mais cela me semble difficile à maintenir, nous avons potentiellement le même problème sur beaucoup d'écrans, il pourrait être facilement cassé si quelqu'un renomme un bouton.
Avez-vous des suggestions ? Peut-être y a-t-il quelque chose que je puisse faire dans BeginRequest dans Global.asax pour détecter une demande en double ? Existe-t-il un paramètre ou une fonctionnalité de l'UpdatePanel qui l'empêche de faire cela, ou peut-être quelque chose dans l'AjaxControlToolkit qui l'empêchera ?