Comment savoir si l'utilisateur clique sur le bouton retour du navigateur ou sur le bouton Actualiser

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

Question

Je dois rechercher si l'utilisateur clique sur le bouton Précédent du navigateur ou sur le bouton Actualiser.

Je dois rediriger la page vers la page d'erreur lorsqu'il clique sur le bouton Précédent ou Actualiser. Comment faire cela.

Je dois le faire en javascript pour ma page ASP.net

Était-ce utile?

La solution

Tout d’abord, envoyer des messages d’erreur si les utilisateurs utilisent Back ou doivent actualiser une page pour une raison quelconque est une très mauvaise idée. Au lieu de cela, vous devriez traiter de manière transparente avec cela. Pensez à une page qui ne s'affiche pas complètement à cause de problèmes de niveau de transport. La seule option dont l'utilisateur dispose est de recharger ou de revenir en arrière.

Pour répondre à votre question, vous devez suivre vous-même la navigation de l'utilisateur, c'est-à-dire côté serveur. Oubliez java-script ici. Si l'utilisateur visite un site Web, vous pouvez stocker ces informations dans une session associée à l'utilisateur (il existe plusieurs méthodes pour conserver ces sessions uniques, et je n'entrerai pas dans les détails ici). Si vous stockez dans vos structures internes les pages que l'utilisateur a consultées récemment, il est facile de déterminer une page visitée deux fois, ou une navigation allant dans la "mauvaise". direction.

Vous pouvez facilement généraliser ceci (et rendre le tout plus robuste, par exemple contre les utilisateurs sautant sauvagement entre les urls, ou revenant en arrière de plusieurs étapes à la fois) en construisant un graphique de "autorisé". navigation et navigation lorsque l'utilisateur visite des sites Web.

Le comportement correct alors si l'utilisateur fait un "faux" " la navigation (comme revenir en arrière, recharger = = visiter deux fois) consiste à le remettre sur la bonne voie. Ne pas donner un message d'erreur, il ne peut pas s'échapper! Comme il n'est pas autorisé à recharger ou à revenir en arrière, il ne lui reste plus aucune option.

Autres conseils

Vous ne pouvez pas. Le navigateur n'envoie pas ses propres événements d'interface utilisateur au serveur. Tout ce que vous obtenez sont des requêtes http et l'une ressemble à une autre. Peut-être que vous avez cliqué sur le bouton Précédent ou qu'ils ont peut-être simplement retaper la dernière URL. Dites-nous quels problèmes cela cause et nous pouvons vous aider à adapter votre projet pour qu'il fonctionne un peu mieux avec le protocole http.

Implémentez un PageToken en utilisant un GUID ou un horodatage stocké dans une session et comparez la valeur à un champ masqué du formulaire. Je l'ai fait via un titre PageToken Class . Si la valeur du champ masqué et la variable de session ne correspondent pas, vous n'êtes pas synchronisé et vous le gérez. L'astuce consiste à mapper tous les événements de votre page.

public void GeneratePageToken()
{
    SessionVariables currSession = new SessionVariables();
    hfMasterPageToken.Value = System.DateTime.Now.ToString();
    currSession.PageToken = hfMasterPageToken.Value;
}

public string GetLastPageToken
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return currSession.PageToken;
    }
}

public bool TokensMatch
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return (currSession.PageToken != null
            && currSession.PageToken == hfMasterPageToken.Value);
    }
}

Dans votre méthode Event avant votre code habituel:

if (this.TokensMatch == false)
{
    //Reload the data.
    //Generates a NewPageToken (this.GeneratePageToken();)
    ReloadDataMethod();
    this.MessageToUser =
     "Data reloaded.  Click Edit or Insert button to change.";
    this.MessageType = MessageToUserType.Success;
    this.DisplayMessageToUser = true;
    return;
}

Avec Site.Master

Dans votre Site.Master , insérez après < body >

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<dx:ASPxLoadingPanel ID="MainLoadingPanel" runat="server" ClientInstanceName="MainLoadingPanel" Modal="True" />
<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    MainLoadingPanel.Show();
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            MainLoadingPanel.Hide();
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

Sans Site.Master

Dans votre code commun, insérez après < body >

<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

Je suppose que vous voulez faire cela à cause du post-retour pour éviter de soumettre à nouveau certaines actions ou données, n'est-ce pas? Ironiquement, ce n'était pas un énorme problème avant les formulaires Web asp.net ... parce que vous deviez généralement publier sur une URL différente de la même adresse (un peu comme asp.net mvc en fait).

Un truc que j’ai aimé utiliser ... même si le plus technique des points est plus lent ... était d’avoir une page de saisie et une page de publication. La sortie HTML de la page de publication consistait en un code HTML très minimal avec un javascript minuscule qui remplaçait l'URL actuelle (de la page de publication) de l'historique du navigateur par la page de résultat (ou même la page de renvoi d'origine, si vous le souhaitiez vraiment). Le résultat était que l'utilisateur cliquait sur le bouton Précédent, il était envoyé à la page de saisie d'origine ou, s'il cliquait sur l'actualisation, il était déjà sur la nouvelle page de résultats.

<html><body onload="location.replace('someURL.asp')"></body></html>

Nous l'avons fait dans Java / Struts1 en plaçant une propriété sur le bouton d'envoi. Si le bouton d'envoi était cliqué, le texte du bouton serait envoyé dans la propriété de l'ActionForm. Si l'utilisateur actualisait les informations, la valeur n'était pas définie. Nous savions donc que l'utilisateur n'avait pas cliqué sur le bouton. Dans le cas où la propriété était vide, nous sommes revenus et avons rendu la première page du flux de page. YMMV dans ASP.Net.

Ceci détecte simplement si l'utilisateur atterrit sur votre page en utilisant les boutons Précédent / Suivant ... le seul problème est avec IE8 et les versions antérieures, la version du navigateur ne peut pas gérer cela.

if(performance.navigation.type == 2)
{
    //Do your code here
}

.NET 3.5 peut très bien gérer les boutons Précédent (Suivant) du navigateur. Rechercher avec Google: "Scriptmanager EnableHistory". Vous pouvez contrôler les actions utilisateur qui ajouteront une entrée à l'historique du navigateur (ScriptManager - > AddHistoryPoint) et votre application ASP.NET recevra un événement chaque fois que l'utilisateur cliquera sur les boutons Précédent / Suivant du navigateur.

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