Question

J'utilise le PRG pour éviter la soumission multiple de formulaire. Il a, cependant, un sérieux inconvénient -. Vous ne pouvez pas simplement le message echo de confirmation à l'utilisateur (évidemment, l'utilisateur ne verra pas la page, il sera redirigé vers un autre)

Quelles sont les solutions à ce problème? Je sais que deux d'entre eux, mais aucun d'entre eux semble parfait.

  • Utilisez une URL de redirection personnalisée, comme: http://example.com/?msg=data-saved. Il est apatride, donc je pense qu'il est tout à fait fiable. Mais cela crée des problèmes lorsque l'utilisateur copie le lien, signets il, etc.
  • Enregistrer une variable de session / cookie et vérifier sur chaque chargement de page. Si elle est définie, l'effacer et afficher le message. Il semble OK, mais je ne suis pas sûr de celui-ci - il repose fortement sur les cookies, il est un peu plus compliqué.

Ou peut-être il y a d'autres façons que je ne connais pas? Une combinaison de sessions et des paramètres d'URL? J'sais.

Quelle est la meilleure façon à votre avis? Lequel a le moins des inconvénients? Quels sont les avantages et les inconvénients?

Était-ce utile?

La solution

Quasiment tous les sites Web qui permet aux utilisateurs de se connecter EOD donc en se basant sur un cookie. Il est pas une solution parfaite, mais il est le meilleur que nous avons eu.

En outre la gestion des sessions est une de ces choses qu'un cadre de développement web prend généralement en charge pour vous.

Autres conseils

Il y a plusieurs autres questions de débordement de pile qui touchent à ce sujet, mais je ne pense pas résumer le problème clairement. Voici quelques-unes:

La plupart des solutions pratiques sont à base de session ou présentent des inconvénients plus graves (comme l'intégration du message dans la chaîne de requête).

Si vous ne pouvez pas garantir que vous aurez des sessions, une autre méthode (très coûteuse) est de rediriger vers des vues différentes en fonction du résultat de la soumission du formulaire. Par exemple, vous pouvez rediriger vers EditWidgetView, EditWidgetSaveSuccessfulView ou EditWidgetSaveErrorView (ou peut-être vous ne réorientent pas seulement sur les erreurs). Dans certaines langues et des cadres, cela est impossible au point de vous faire renoncez à montrer des messages de confirmation / erreur du tout, mais dans d'autres, il peut valoir la peine.

Si vous ne voulez pas compter sur les sessions pour une raison quelconque, vous pouvez utiliser une URL Get variable / personnalisée et si cette variable est présente, vérifier le réfèrent. Si le renvoi est correct, puis afficher le message. Oui, cela ajoute le recours à l'envoi Fait référence afin de montrer le message de confirmation, mais sinon vous comptez sur les sessions (qui, bien que fiables, ne sont pas 100% parfait pour toutes les solutions non plus.)

Et honnêtement, certains grands sites qui sont normalement très bien à ce genre de chose juste un bâton « actiondone = true » dans l'url. (Je l'ai remarqué Facebook il le fait dans certains endroits.)

Cela dépend de la plate-forme que vous utilisez sur.

Ruby on Rails appelle ce flash [: avis] = "Votre action a été effectuée", ASP.NET MVC appelle ce TempData [ "avis"] = "Votre action a été réalisée" ...

En fait ils ont juste stocker des données dans HttpSession pour un seul voyage aller-retour seulement. De cette façon, vous pouvez récupérer des données sur une autre requête Web.

À très tard à cette discussion ..

Vous pouvez utiliser une combinaison des deux options proposées.

Après la demande POST le client est redirigé (303) vers une URL indiquant qu'il pourrait y avoir un message de réponse à cette requête:

Client: GET  http://example.com/foo.cgi
Server: 200  Ok

Client: POST http://example.com/bar.cgi
Server: 303  http://example.com/foo.cgi?msg=true

Si l'argument est msg le message true être recherché dans la session et (si trouvé) inclus dans la réponse au client.
Si l'argument est ! true <=> (ou non présent), l'étape de recherche est ignorée.

Avec cette solution, vous empêchez le message réel étant show dans l'URL, l'URL indique seulement qu'il pourrait y avoir un message. En outre, le message ne s'affiche en cas de besoin (= une fois trouvé dans la session).

Un autre avantage est que cette solution permet également pour une bonne trésorerie des contrôles à inclure des réponses HTTP.

J'utilise la méthode variable de session. Je ne aime pas vraiment intégrer des messages d'erreur pour l'affichage dans l'URL, en particulier les questions URL sauvegarde / partage note de, et j'aime que si l'utilisateur de recharger la page de destination, ce sera une instance propre.

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