2011-07-07 7 views
5

Come posso sapere se l'utente ha premuto F5 per aggiornare la mia pagina (Qualcosa come la SO. Se aggiorni la pagina, il contatore delle domande non viene aumentato). Ho testato molti frammenti di codice menzionati in una dozzina di tutorial, ma nessuno ha funzionato correttamente.Rileva aggiornamento del browser

Per essere più chiari, supponiamo di avere un modulo Web vuoto e vorrei rilevare se l'utente ha premuto F5 sul lato client (causando un aggiornamento non inviato) o meno.

Posso usare le variabili di sessione, ma se l'utente naviga verso un'altra pagina del mio sito e poi torna indietro, mi piacerebbe considerarlo come una nuova visita, non un aggiornamento. quindi questa non è una variabile per lo scope di sessione.

Grazie.

Update: L'unica soluzione che ho trovato è stato quello di ereditare le mie pagine da una pagina di base, l'override del metodo di carico come di seguito:

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

e in ogni pagina se ero interessato a sapere se questo è un aggiornamento:

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

si dice 'posso usare le variabili di sessione' così perché non solo memorizzare l'ultima pagina visitata? – tomfumb

+0

Beacuse Devo memorizzarlo in ogni pagina. In realtà, forse non è una cattiva idea usare una pagina di base ... – Kamyar

risposta

1

L'unica soluzione è quello di rendere sicuri a redirect to the same page, e qui è una domanda simile: Post-Redirect-Get with ASP.NET

Ma ci sono anche alcuni altri trucchi, con l'aggiunta di qualche biglietto sulla pagina e vedere se questo è lo stesso o di avere il cambiamento, si veda l'esempio completo e il codice a:

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

e uno più :

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

+0

Provato entrambi, senza fortuna. – Kamyar

+0

Potresti spiegare "fare un reindirizzamento alla stessa pagina"? – Kamyar

+0

@kamyar Ho usato l'idea del codeproject con qualche codice in più, ma non sempre funziona ... è complicato. So che il reindirizzamento perdere un sacco di dati utili messaggio ... lo so ... – Aristos

4

mi imbatto in questo problema e utilizzare il seguente codice. Funziona bene per me.

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(); 
    } 
}