2010-08-27 3 views
7

Simple ici ... existe-t-il un moyen propre d'empêcher un utilisateur de double-cliquer sur un bouton dans un formulaire Web et de provoquer ainsi le déclenchement d'événements dupliqués? Si j'avais un formulaire de commentaire par exemple et que l'utilisateur tape "ceci est mon commentaire" et clique sur "soumettre", le commentaire est affiché ci-dessous ... mais s'il double-clique, triple-clique ou le clavier, ils peuvent entraîner la publication de plusieurs versions.Empêcher la publication en double dans ASP.Net (C#)

côté client je pouvais désactiver facilement le bouton onclick - mais je préfère des solutions côté serveur à des choses comme ça :)

Y at-il un délai d'attente de postback par viewstate qui peut être réglé par exemple?

Merci

Répondre

2

Je ne pense pas que vous devriez charger le serveur pour des tâches triviales comme celles-ci. Vous pouvez essayer une solution de blocage de l'interface utilisateur jquery comme this. Microsoft Toolkit Ajax devrait également avoir un certain contrôle qui fait la même chose. Je l'avais utilisé il y a longtemps, je n'arrive pas à me rappeler le nom du contrôle.

+0

Juste point, côté client c'est! – isNaN1247

+0

lien semble être mort. –

1

Définir une variable de session lorsque l'utilisateur entre la page comme session [ "FormXYZSubmitted"] = false. Lorsque le formulaire est soumis vérifier cette variable comme

if((bool) Session["FormXYZSubmitted"] == false) { 
    // save to db 
    Session["FormXYZSubmitted"] = true; 
} 
+0

vous pouvez le faire sur le bouton événement click et pour être précis –

+0

Je n'ai pas inclus cela mais c'est correct. – Zafer

0

J'ai eu le même scénario. La solution d'un de mes collègues était de mettre en place une sorte de Timer en Javascript, pour éviter de considérer le second clic comme un clic.

Espoir qui aide,

0

Désactiver le bouton lors du clic, utiliser jquery ou microsoft ajax toolkit.

0

Selon la façon dont cela est important pour vous, pourrait créer un tableau d'un temps GUID que vous retirez du tableau une fois la mise à jour a été traité (c.-à-réaffectés dans le champ viewstate/caché)

Si le guid n'est pas dans le tableau sur la publication, la demande est invalide. Remplacer la table de base de données par une table dans un environnement en cluster.

0

Le côté client peut être difficile si vous utilisez la validation Asp.Net.

Si vous avez une page maître, mettez ceci dans la page principale:

void IterateThroughControls(Control parent) 
    { 
     foreach (Control SelectedButton in parent.Controls) 
     { 
      if (SelectedButton is Button) 
      { 
       ((Button)SelectedButton).Attributes.Add("onclick", " this.disabled = true; " + Page.ClientScript.GetPostBackEventReference(((Button)SelectedButton), null) + ";"); 
      } 

      if (SelectedButton.Controls.Count > 0) 
      { 
       IterateThroughControls(SelectedButton); 
      } 
     } 
    } 

Ensuite, ajoutez ceci à la page principale Page_Load:

IterateThroughControls(this); 
Questions connexes