2011-07-07 19 views
5

¿Cómo puedo averiguar si el usuario presionó F5 para actualizar mi página? (Algo así como cómo se implementó SO. Si actualiza su página, el contador de preguntas no aumenta). He probado muchos fragmentos de código mencionados en una docena de tutoriales, pero ninguno funcionó correctamente.Detectar actualización del navegador

Para ser más claros, supongamos que tengo un formulario web vacío y me gustaría detectar si el usuario ha presionado F5 en el lado del cliente (lo que provoca una actualización no enviada) o no.

Puedo usar variables de sesión, pero si el usuario navega a otra página de mi sitio, y luego regresa, me gustaría considerarlo como una nueva visita, no como una actualización. así que esta no es una variable de ámbito de sesión.

Gracias.

Actualización: La única solución que pude encontrar fue a heredar mis páginas de una página base, reemplazar el método de carga, como a continuación:

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

y en cada página si estaba interesado en saber si esta es una actualización:

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

dices 'Puedo usar variables de sesión', ¿por qué no solo almacenar la última página visitada? – tomfumb

+0

Beacuse Tengo que almacenarlo en cada página. En realidad, tal vez no sea una mala idea usar una página base ... – Kamyar

Respuesta

1

La única solución segura es hacer a redirect to the same page, y aquí está una pregunta similar: Post-Redirect-Get with ASP.NET

Pero también hay algunos otros trucos, añadiendo un poco de entradas en la página y ver si este es el mismo o tiene cambio, ver el ejemplo completo y el código en:

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

y uno más :

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

+0

Intenté ambas cosas, sin suerte. – Kamyar

+0

¿Podría explicar "hacer un redireccionamiento a la misma página"? – Kamyar

+0

@kamyar He utilizado la idea del proyecto de código con un código adicional, pero no siempre funciona ... es complicado. Sé que la redirección pierde una gran cantidad de datos útiles de mensajes ... Lo sé ... – Aristos

4

me encuentro con este problema y pega el siguiente código. Funciona bien para mí

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