2011-07-07 18 views
5

Jak mogę się dowiedzieć, czy użytkownik nacisnął klawisz F5, aby odświeżyć moją stronę (Coś takiego, jak zaimplementowano SO. Jeśli odświeżysz stronę, licznik pytań nie zostanie zwiększony). Przetestowałem wiele fragmentów kodu wymienionych w kilkunastu samouczkach, ale żaden z nich nie działał poprawnie.Wykryj odświeżanie przeglądarki

Aby być bardziej zrozumiałym, załóżmy, że mam pusty formularz internetowy i chciałbym sprawdzić, czy użytkownik nacisnął klawisz F5 po stronie klienta (powodując, że odświeżanie nie zostanie wysłane), czy też nie.

Mogę używać zmiennych sesji, ale jeśli użytkownik przejdzie na inną stronę mojej witryny, a następnie wróci, chciałbym ją uznać za nową, a nie odświeżoną. więc nie jest to zmienna zakresu sesji.

Dzięki.

Aktualizacja: Jedyne obejście mogłem znaleźć było dziedziczyć moich stron ze strony bazowej, zastąpić metodę obciążenia jak poniżej:

public class PageBase : System.Web.UI.Page 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     this.Session["LastViewedPage"] = Request.RawUrl; 
    } 
} 

iw każdej strony, gdybym był zainteresowany, aby wiedzieć, czy to jest odświeżania:

if (this.Session["LastViewedPage"].ToString() == Request.RawUrl) 
{ 
    // This is a refresh! 
} 
+1

mówisz "Mogę używać zmiennych sesji", dlaczego więc nie zapisać ostatniej odwiedzonej strony? – tomfumb

+0

Beacuse Muszę go przechowywać na każdej stronie. Właściwie to może nie jest zły pomysł na używanie strony bazowej ... – Kamyar

Odpowiedz

1

jedynym pewnym rozwiązaniem jest, aby a redirect to the same page, a tutaj jest podobne pytanie: Post-Redirect-Get with ASP.NET

Ale istnieją również inne sztuczki, dodając trochę bilet na stronie i sprawdzić, czy jest to ten sam lub zlecić zmianę, zobacz pełną przykład i kod w:

http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET

i jeszcze jedno :

http://dotnetslackers.com/community/blogs/simoneb/archive/2007/01/06/Using-an-HttpModule-to-detect-page-refresh.aspx

+0

Próbowałem obu, bez powodzenia. – Kamyar

+0

Proszę wyjaśnić "przekierowanie do tej samej strony"? – Kamyar

+0

@kamyar Używam idei codeproject z dodatkowym kodem, ale nie zawsze działa ... jest skomplikowana. Wiem, że przekierowanie utraciło wiele użytecznych danych wiadomości ... Wiem ... – Aristos

4

biegnę do tego problemu i użyć następującego kodu. To działa dobrze dla mnie.

bool isPageRefreshed = false; 

protected void Page_Load(object sender, EventArgs args) 
{ 
    if (!IsPostBack) 
    { 
     ViewState["ViewStateId"] = System.Guid.NewGuid().ToString(); 
     Session["SessionId"] = ViewState["ViewStateId"].ToString(); 
    } 
    else 
    { 
     if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString()) 
     { 
      isPageRefreshed = true; 
     } 

     Session["SessionId"] = System.Guid.NewGuid().ToString(); 
     ViewState["ViewStateId"] = Session["SessionId"].ToString(); 
    } 
} 
Powiązane problemy