0 votes

Postbacks multiples et simultanés lors de l'utilisation de UpdatePanels

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 ?

0voto

gingerbreadboy Points 3129

Faites un contrôle personnalisé qui hérite du bouton asp et a script pour se désactiver et s'activer. Ce qui suit n'a pas été testé mais c'est un point de départ.

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

0voto

Yakov R. Points 70

Première solution

Vous pouvez empêcher l'utilisateur d'effectuer des clics multiples en définissant (dans le balisage du bouton)

OnClientClick="this.disabled = true;" 

et définir cette propriété

UseSubmitBehavior="false"

Cela désactivera le bouton une fois qu'il aura été cliqué. Vous n'avez pas besoin d'activer le bouton, il s'activera de lui-même au retour du postback. L'option "UseSubmitBehavior" désactivera le comportement par défaut du bouton "Submit" et autorisera l'envoi d'un message même si le bouton est désactivé.

La solution ci-dessus ne s'applique qu'aux contrôles de boutons et n'est pas prise en charge sur toutes les plateformes. voir MSDN pour les plateformes prises en charge.


Deuxième solution :

Ceci soumettra le formulaire, si la page est toujours disponible sur le client après 10 millisecondes le bouton \control sera désactivé.

Écrire une fonction javascript

<script language="javascript" >

function preventMultipleClicks(a){
   window.setTimeout(function() { a.disabled=true; }, 10)
   return true;
}

</script>

Ensuite, appelez-le dans la propriété OnClientClick du bouton ou du contrôle de postback.

OnClientClick="preventMultipleClicks(this);"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X