2009-04-05 8 views
4

en double de Asp.Net Button Event on refresh fires again??? GUID?Prévenir la page Rafraîchir en C#

bonjour, ive un site Web et lorsqu'un utilisateur clique sur un bouton et la postback page, si l'utilisateur actualiser la page ou appuyez sur F5 la méthode bouton est appelé à nouveau. Quelqu'un connaît une méthode pour empêcher l'actualisation de la page sans rediriger la page vers la même page?

Quelque chose comme si (page.isRefresh) ou quelque chose ... ou si une solution javascript existe, c'est mieux.

ce voit des œuvres .... mais quand je le rafraîchir ne Postback mais montre la valeur avant dans la zone de texte

http://www.dotnetspider.com/resources/4040-IsPageRefresh-ASP-NET.aspx

private Boolean IsPageRefresh = false; 
protected void Page_Load(object sender, EventArgs e) 
{   
    if (!IsPostBack) 
    { 
     ViewState["postids"] = System.Guid.NewGuid().ToString(); 
     Session["postid"] = ViewState["postids"].ToString(); 
     TextBox1.Text = "Hi"; 

    } 
    else 
    { 
     if (ViewState["postids"].ToString() != Session["postid"].ToString()) 
     { 
      IsPageRefresh = true; 
     } 
     Session["postid"] = System.Guid.NewGuid().ToString(); 
     ViewState["postids"] = Session["postid"]; 
    } 
} 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    if (!IsPageRefresh) // check that page is not refreshed by browser. 
    { 
     TextBox2.Text = TextBox1.Text + "@"; 

    } 
} 

Répondre

8

Merci pour les commentaires et désolé pour mon erreur, je trouve ce code dans: http://www.codeproject.com/KB/aspnet/Detecting_Refresh.aspx Et cette fois), testé

private bool _refreshState; 
    private bool _isRefresh; 

    protected override void LoadViewState(object savedState) 
    { 
     object[] AllStates = (object[])savedState; 
     base.LoadViewState(AllStates[0]); 
     _refreshState = bool.Parse(AllStates[1].ToString()); 
     _isRefresh = _refreshState == bool.Parse(Session["__ISREFRESH"].ToString()); 
    } 

    protected override object SaveViewState() 
    { 
     Session["__ISREFRESH"] = _refreshState; 
     object[] AllStates = new object[2]; 
     AllStates[0] = base.SaveViewState(); 
     AllStates[1] = !(_refreshState); 
     return AllStates; 
    } 

    protected void btn_Click(object sender, EventArgs e) 
    { 
     if (!_isRefresh) 
      Response.Write(DateTime.Now.Millisecond.ToString()); 
    } 
+0

cela ne fonctionne pas pour Actualiser, lorsque vous actualisez la page, il dit au navigateur de répéter le dernier événement – jmpena

+0

Cela arrête juste le bouton de travailler plus d'une fois, peu importe si le message provient d'un rechargement ou un clic sur un bouton réel. – Guffa

+0

ouais cela fonctionne. C'est le même code que j'ai trouvé, mais quand vous cliquez sur le bouton, puis appuyez sur rafraîchir, il montre "HI" et non la nouvelle valeur. : P je pense que je peux vivre avec, essayer de modifier cela. merci – jmpena

4

Vous pouvez tester la propriété Page.IsPostBack à voir si la page répond à une demande initiale ou si elle gère un PostBack tel que votre événement de clic sur un bouton. Voici quelques informations supplémentaires: w3schools on IsPostBack

Malheureusement, cela ne résoudra pas votre problème car IsPostBack sera vrai lorsque l'utilisateur cliquera sur le bouton et qu'il actualisera la page après l'action du bouton.

Si vous effectuez une tâche comme exécuter CRUD sur certaines données, vous pouvez Response.Redirect l'utilisateur à la même page lorsque vous avez terminé le traitement et contourner ce problème. Il a l'avantage de recharger votre contenu (en supposant que vous avez ajouté un enregistrement à la base de données qu'il afficherait maintenant dans la page ...) et empêche le problème de rafraîchissement. Le seul inconvénient est qu'ils resoumisent encore la forme en remontant dans leur histoire.

Les publications étaient un mauvais choix d'implémentation pour l'Asp.net et sont généralement ce qui ruine la plate-forme Webforms pour moi.

+1

Response.Redirect ne contourne pas le problème. Un utilisateur peut toujours revenir en arrière avec le bouton de retour dans un navigateur et actualiser au piont où ils avaient soumis ce formulaire et il enverra toujours une autre demande à la base de données. – PositiveGuy

1

Cela ne résout pas le problème. Tout d'abord, stocker un jeton dans l'état d'affichage n'est pas une bonne idée, car il peut être désactivé. Utilisez l'état de contrôle à la place. Bien que, un HttpModule est une meilleure solution.

Dans l'ensemble, cela ne fonctionnera pas de toute façon. Si vous ouvrez un autre onglet/fenêtre, la session sera invalide pour l'onglet/fenêtre précédent. Par conséquent, le freinage. Vous devez en quelque sorte stocker une valeur unique chaque fois qu'une page est chargée pour la première fois. Utilisez-le pour déterminer d'où provient la requête, puis vérifiez le "rafraîchir le ticket". Comme vous pouvez le voir, l'objet pour un utilisateur peut devenir très gros en fonction de la quantité de requêtes effectuées, où et pendant combien de temps vous stockez ces informations.

Je n'ai pas vu de solution à cela, j'ai peur, car c'est assez complexe.

1
 bool IsPageRefresh ; 

if (Page.IsPostBack) 
    { 
     if (ViewState["postid"].ToString() != Session["postid"].ToString()) 
      IsPageRefresh = true; 
    } 
    Session["postid"] = System.Guid.NewGuid().ToString(); 
    ViewState["postid"] = Session["postid"]; 
+0

Où est défini 'bool IsPageRefresh;' – bgmCoder

+0

il est préférable de l'utiliser comme une variable globale et le reste du code sur la méthode pageload, de cette façon, vous pouvez utiliser le IsPageRefresh à tout moment. – laertespl

Questions connexes