Empêcher la publication lorsque l'utilisateur clique sur le bouton Précédent du navigateur

StackOverflow https://stackoverflow.com/questions/1791416

  •  22-09-2019
  •  | 
  •  

Question

J'ai une page Web qui envoie des e-mails à plusieurs utilisateurs (liste de distribution en ligne).Après avoir cliqué sur le bouton Soumettre et envoyé l'e-mail, une page d'état s'affiche indiquant le nombre d'e-mails envoyés, les erreurs et d'autres informations.Si l'utilisateur clique sur le bouton Précédent, l'e-mail est renvoyé.Comment puis-je empêcher cela ?

NOTE:Le navigateur invite l'utilisateur à "resoumettre" ou "renvoyer" les données à la page avant d'envoyer l'e-mail, mais cela n'empêche pas mes utilisateurs de cliquer dessus et de se demander ensuite pourquoi deux copies de l'e-mail ont été envoyées.

Environnement:

  • Serveur:C#, ASP.NET 2.0, IIS6
  • Client:n'importe quel navigateur (je ne veux pas de solution spécifique à IE comme SmartNavigation)
Était-ce utile?

La solution

Dans votre code, juste après l'envoi des e-mails, effectuez une redirection 302 vers une page de confirmation :

protected void btnSend_Click(object sender, EventArgs e)
{
    SendManyEmails();
    Response.Redirect("confirmation.aspx");
}

Avec ce genre de code, le POST sur la page d'origine ne finira pas dans l'historique du navigateur.

Ce modèle commun est connu sous le nom de Publier/Redirection/Obtenir un modèle.

Informations bonus sur le maintien de l'état lors de l'exécution de Post/Redirect/Get

Le principal inconvénient de ce modèle est que tout l'état du traitement de la requête POST est perdu lors de la redirection de l'utilisateur - commençant ainsi un nouveau contexte de requête.Dans ASP.NET, cela inclut les membres du Page et tout Control objets, ainsi que tout ce qui est stocké dans le ViewState.

Si vous générez une sorte d'"objet d'état" - peut-être un journal des messages électroniques envoyés - lors du traitement de la requête POST, vous aurez besoin d'un moyen de sauvegarder cet objet pour la requête GET suivante.Certains frameworks Web ont des fonctionnalités spécifiquement destinées à cela :RoR a flash, ASP.NET MVC a TempData.Les formulaires ASP.NET n'ont pas un tel concept intégré, vous devrez donc trouver quelque chose vous-même.

Enregistrer l'objet dans le Session sur le POST, le lire et le supprimer sur le GET suivant serait un moyen de résoudre ce problème.Vous pouvez créer une abstraction autour de cela si vous l'utilisez à plusieurs endroits, ou vous pouvez rechercher sur le Web des implémentations existantes de flash/TempData pour les formulaires ASP.NET.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top