J'écris une application qui, si l'utilisateur renvoie la réponse, peut renvoyer la même information et perturber le flux et l'intégrité des données. Comment puis-je le désactiver pour les utilisateurs qui sont avec et sans javascript activé ?
Réponses
Trop de publicités?Ce n'est malheureusement pas possible. Cependant, considérez le modèle de navigation de vos applications. Utilisez-vous le modèle PRG Post/Redirect/Get ? http://en.wikipedia.org/wiki/Post/Redirect/Get ?
Ce modèle est plus adapté aux boutons de retour que le modèle Postback.
Tu ne devrais pas.
Vous pouvez attacher du script à l'événement onbeforeunload d'une page et confirmer avec l'utilisateur que c'est ce qu'il veut faire ; et vous pouvez aller un peu plus loin et essayez à le désactiver mais bien sûr, cela ne fonctionnera que pour les utilisateurs qui ont activé le javascript. Envisagez plutôt de réécrire l'application de manière à ne pas engager de transactions sur chaque page soumise, mais seulement à la fin du processus.
Je vous recommande vivement de faire des efforts héroïques pour éviter de casser le bouton "retour", c'est un moyen sûr d'aliéner vos utilisateurs et c'est même devenu le numéro 1 sur le site Internet de la Commission européenne. Les 10 principales erreurs de conception Web de Jacob Neilsen en 1999 .
Vous pourriez peut-être envisager de poser plutôt la question : "Comment éviter de casser le bouton retour pour <insérer votre scénario ici> ?".
Si la réponse de Scott est proche de la vérité, envisagez de modifier votre flux pour adopter le modèle PRG. Si c'est autre chose, donnez un peu plus de détails et voyez comment nous pouvons vous aider.
J'ai trouvé un petit truc qui désactive le bouton retour en utilisant JavaScript. Je l'ai vérifié sur chrome 10, firefox 3.6 et IE9 :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<title>Untitled Page</title>
<script type = "text/javascript" >
function changeHashOnLoad() {
window.location.href += "#";
setTimeout("changeHashAgain()", "50");
}
function changeHashAgain() {
window.location.href += "1";
}
var storedHash = window.location.hash;
window.setInterval(function () {
if (window.location.hash != storedHash) {
window.location.hash = storedHash;
}
}, 50);
</script>
</head>
<body onload="changeHashOnLoad(); ">
Try to hit back!
</body>
</html>
La meilleure option est de ne pas dépendre des postbacks pour contrôler le flux, mais si vous êtes coincé avec (pour l'instant)
vous pouvez utiliser quelque chose comme ceci :
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");
Vous constaterez bientôt qu'il ne fonctionne pas sur tous les navigateurs, mais vous pourrez alors introduire une vérification dans votre code comme :
if (Page.IsPostBack)
{
if (pageIsExpired()){
Response.Redirect("/Some_error_page.htm");
}
else {
var now = Now;
Session("TimeStamp") = now.ToString();
ViewState("TimeStamp") = now.ToString();
}
private boolean pageIsExpired()
{
if (Session("TimeStamp") == null || ViewState("TimeStamp") == null)
return false;
if (Session("TimeStamp") == ViewState("TimeStamp"))
return true;
return false;
}
Cela résoudra le problème dans une certaine mesure, le code n'est pas vérifié -- seulement à titre d'exemple