2010-02-01 19 views
16

en cuenta la situación:¿Qué sucede cuando presiono el botón ATRÁS del navegador?

  1. Visité una página de un sitio web construido con ASP.NET. La página es una página aspx simple que contiene controles de servidor ASP.NET.

  2. Hice clic en un enlace que me lleva a alguna otra página en el mismo sitio web.

  3. Hice clic en el botón ATRÁS del navegador.

PREGUNTA: Lo que sucede en términos de ciclo de vida de la página? ¿Ocurren todos los eventos o el navegador solo muestra la versión en caché de la página sin realizar ninguna solicitud?

Respuesta

15

Creo que la mejor respuesta es: depende del navegador, especialmente después de una publicación/devolución.

Los navegadores antiguos solían mostrar un cuadro de diálogo de confirmación al efecto de "la página contiene datos POST que se volverán a enviar", y puede continuar (reenviar) o cancelar. Como todo lo que ocurre en ASP.NET WebForms es parte del elemento FORM (ViewState, events, etc.), esto provocaría la repetición del ciclo de vida completo.

Por supuesto, esto no causaba problemas con los envíos duplicados, por lo que muchos sitios tuvieron que encontrar soluciones para el problema del engaño, y en la actualidad la mayoría de los buscadores solo buscan la página del caché.

... Eso es a menos que anule los encabezados de control de caché y obligue al navegador a no almacenar la página en el caché. Obviamente, en ese caso, no se puede recuperar de la memoria caché, por lo que generalmente se volverá a enviar. Pero, de nuevo, depende del navegador, por ejemplo, algunos navegadores no permitirán el reenvío a través de SSL, por lo que si ese es el protocolo en uso, el usuario verá un mensaje que dice que la página ha expirado/no puede ser mostrado.

Ahora que lo pienso, probablemente una respuesta aún mejor sea: Como diseñador de un sitio, no se puede depender de ningún comportamiento específico del navegador del usuario cuando se hace clic en el botón Atrás. Si una presentación duplicada puede tener efectos secundarios negativos (como cargar una tarjeta de crédito dos veces), entonces debe tomar las medidas adecuadas para evitar que eso suceda. De todos modos, es una buena práctica ya que es completamente posible que un usuario simplemente haga doble clic en el botón "enviar" por accidente.

+0

Estoy de acuerdo con la respuesta de Aaronaught. No trataría de escribir ningún código que asuma que el botón 'atrás' se comportará de cierta manera en todos los navegadores. – jessegavin

+0

Creo que consideró un escenario diferente de post-respaldo en la misma página usando un control y luego presionando el botón ATRÁS ... ¿Estoy en lo cierto? – Manish

+0

@Manish: Lo que importa no es necesariamente si la * presente * página del usuario tiene datos de 'POST', sino si la página * anterior * (a la que los llevará el botón Atrás) tenía datos de 'POST' . Eso incluye ambos escenarios: volver desde una devolución de datos y volver desde una página nueva cuando la página anterior tenía una devolución de datos (o simplemente 'POST'). – Aaronaught

0

normalmente debería producirse todos los eventos, pero si usted tiene un navegador súper de lo que podría suceder a mostrar una página en caché que acaba de puede poner un punto de interrupción en la carga de la página y ver si va a ocurrir

0

La página se mostraría desde la memoria caché.

+0

Así que si tengo conjunto Response.Cache.SetCacheability (HttpCacheability.NoCache), sería devolver el golpe que el navegador para emitir una instrucción Get solicitud de la página proactiva, o tal vez incluso una devolución de datos si esa fue la última acción del usuario? – AaronLS

+0

sí, sería una devolución de datos si tiene Response.Cache.SetCacheability (NoCache) establecido, pero para algunas páginas verá el mismo contenido. Intente utilizar Response.Cache.SetCacheability (HttpCacheability.NoCache); Response.Cache.SetExpires (DateTime.Now-new TimeSpan (1,0,0)); Response.Cache.SetLastModified (DateTime.Now); Response.Cache.SetAllowResponseInBrowserHistory (false); – Ravia

+0

Creo que obtendrías un aviso de "página vencida" en lugar de la página, pero creo que todavía depende del navegador. – Codesleuth

1

Incluso hemos intentado

Response.ExpiresAbsolute = DateTime.Parse("1/1/1980"); 
Response.AddHeader("cache-control", "no-store, must-revalidate, private"); 
Response.AddHeader("Pragma", "no-cache"); 

para resolver este tipo de problema

Cuestiones relacionadas