2010-01-30 3 views
5

J'ai page .aspx cette page insère les données à la base de données sur un clic de bouton. Mais quand j'appuie sur le bouton ça va bien. Je reçois le message Successfully comme "données insérées avec succès". Dans cette situation, si j'appuie sur "F5" ou Actualise la page, il déclenche l'événement de clic sur le bouton. Pourquoi ça devrait être? Comment éviter cette condition?Comment éviter les événements bouton sur Actualiser de la page

+0

pouvez-vous ajouter un code de votre? – bala3569

Répondre

9

Lorsque l'utilisateur clique F5 (ou utilise un bouton de la barre d'outils pour actualiser la page), il va faire une nouvelle demande, identique au précédent, à envoyer au serveur. Le Button.Click événement sera être relancé, mais vous avez quelques moyens de vous protéger contre l'insertion des données deux fois.

La meilleure façon, à mon humble avis, est d'utiliser le Post/Redirect/Get pattern. Dans votre code, juste après le point où les données sont enregistrées, faites une redirection 302 vers une page de confirmation:

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

Lorsque vous utilisez le motif, la POST à la page originale ne se terminera pas dans l'historique du navigateur, et l'actualisation de la page de résultats entraînera la répétition du GET final, ce qui devrait être sûr.

+0

J'ai lu l'article. mais Comment utiliser GET/POST dans le scénario de détail principal alors? –

+0

Je ne suis pas sûr de ce que vous entendez par "scénario de détail principal". Comme indiqué dans mon exemple de code, vous devez simplement faire un "Response.Redirect", qui "annulera" puis "POST" et rendra le navigateur à un nouveau "GET". –

+0

ok je vais essayer, merci pour la réponse –

0

L'actualisation soumettra de nouveau le formulaire que vous avez publié la dernière fois lorsque vous avez cliqué sur le bouton. Habituellement, lorsque vous actualisez une page, vous pensez à OBTENIR la page à nouveau ou à faire un HTTP GET, mais puisque la dernière chose que vous avez faite était un POST (lorsque vous avez cliqué sur le bouton "submit") tenter d'invoquer la même réponse.

Je suggère d'utiliser le modèle Post/Redirect/Get comme suggéré par Jorn Schou-Rode.

Cet article semble également pertinent. http://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh

+0

Je ne pense pas que TJB le deuxième lien que vous avez fourni est l'utilisation complète. J'ai besoin de trop d'exécution, n'est-ce pas? vraiment le code est bon mais pas correct. Voir Si j'ai 100 pages donc selon cet article, je dois coder sur chaque page avec les champs respectifs. Ce qui est faux. Est-ce un autre moyen? –

4

Ajouter dans votre classe:

#region Browser Refresh 
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()); 
    if (Session["ISREFRESH"] != null && Session["ISREFRESH"] != "") 
     isRefresh = (refreshState == (bool)Session["ISREFRESH"]); 
} 

protected override object SaveViewState() 
{ 
    Session["ISREFRESH"] = refreshState; 
    object[] AllStates = new object[3]; 
    AllStates[0] = base.SaveViewState(); 
    AllStates[1] = !(refreshState); 
    return AllStates; 
} 

#endregion 

Et dans votre cliquage faire ceci:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    if (isRefresh == false) 
    { 
     Insert Code here 
+0

bonne réponse. cela vous dérangerait-il si vous expliquiez votre code ici? Merci – fc123

+0

Je suppose que 'LoadViewState' et' SaveViewState' doivent être câblés à certains événements?Lesquels et/ou comment faites-vous cela? – RBarryYoung

+0

sympa! J'ai mis le code dans ma page de base et utilisé la condition if dans la page où l'événement de clic de bouton est présent. ça a bien marché! bon travail +1 pour vous – Vijayaraghavan

1

Ajouter un panneau de mise à jour et définir le mode de mise à jour du panneau de mise à jour en tant que condition. Cela a fonctionné pour moi !!

Questions connexes