2012-03-19 67 views
6

Tengo problemas con una simple aplicación ASP.NET y el botón Atrás después de una publicación.El navegador ASP.NET muestra "la página web ha caducado" para el botón Atrás (después de una publicación posterior)

La página en cuestión tiene un formulario simple, algunos campos de texto, etc., y un menú desplegable que hace una devolución de datos (autopostback).

El flujo "normal" es el usuario rellena el formulario y quizás cambie el menú desplegable. Según el valor desplegable, el contenido de la página podría cambiar.

El problema que tengo es que una vez que el usuario ha cambiado el menú desplegable y la devolución de datos se ha completado, el usuario hace clic en el botón Atrás. Ven un mensaje de "página web expirada" de IE.

He configurado lo siguiente:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.Private); 

Pero eso no parece haber clavado el problema.

El encabezado de respuesta real Cache-Control lee como:, no-cache privada: "Set-Cookie"

En una aplicación ASP clásico del con una cabecera de respuesta Cache-Control de simplemente el botón "privado" de nuevo se comporta como se esperaba después de una "publicación posterior".

¿Hay alguna forma de obligar a ASP.NET a establecer explícitamente el control de caché exactamente como "privado"? ¿O cualquier otra solución que tenga como resultado que el botón Atrás y las devoluciones funcionen bien juntas?

Gracias!

Respuesta

1

Lo que está tratando es en realidad un viejo problema. En esencia, la razón por la que está viendo el mensaje "la página web ha expirado" es porque se ha empleado una de las técnicas para deshabilitar el botón "volver". La técnica establece el caché en una fecha anterior, lo que hace que el navegador muestre este error si el usuario hace clic en el botón "Atrás".

Esa sería la siguiente línea de código:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 

Esto ha sido un problema, sobre todo con WebForms ASP.NET debido a cómo funciona la devolución de datos, en comparación con otros marcos.

Para una explicación detallada de todos los problemas involucrados, recomiendo leer el artículo vinculado a continuación. No responde su pregunta directamente, pero creo que obtendrá más información que una simple respuesta y lo ayudará a pensar en sus opciones, armado con una mejor comprensión del tema en cuestión. Asegúrese de leer las partes 1 y 2.

http://www.4guysfromrolla.com/webtech/111500-1.shtml

tengo una idea sobre cómo hacer que el botón "atrás" se comporta como un botón de "atrás" de nuevo, de manera que las devoluciones de datos no son tratados como una navegación de la página:

Personalmente, he adoptado un enfoque (discutible hackish/descuidado) de poner cosas en un Panel de actualización cuando no quiero el conflicto del botón postbacl/back, ya que uso Ajax en la mayoría de mis aplicaciones de todas formas. Esto obliga al botón "volver" a volver a la página anterior, en lugar de continuar en la misma página, pero volviendo a los valores de control como estaban antes de la devolución de datos.

+0

No tiene mucho sentido para mí que una aplicación ASP clásico que pone de caducidad a -1 minuto, privado de control de caché permite la espalda el botón funciona "como se esperaba", pero una aplicación ASP.NET con vencimiento establecido en -1 minuto y el control de caché establecido en "privado, no-caché: establecer cookie" no funciona. Esto para mí parece apuntar a "no-cache: set cookie" como el problema. – user505765

+0

Entiendo. La diferencia es que Classic ASP no tiene post-backs con los que lidiar. Al hacer clic en un botón, se activa la "Acción" del formulario y se carga una página completamente nueva cada vez. Con ASP.NET, si cambia una lista desplegable, y esa lista desplegable tiene "autopostback" establecido en verdadero, entonces el navegador realmente ve esto como una navegación a una página nueva. Todo está en cómo se implementan las devoluciones, que es una fuente constante de problemas en casos como este. Técnicamente, cambiar un conjunto desplegable para autompostback activa la opción "publicar" en el formulario, pero el paradigma de WebForms lo desenfoca ... – David

+0

Quizás esta es una mejor explicación: para el navegador, cada devolución es en realidad una visita a una página nueva, y se almacena en la historia, a pesar de que el paradigma de WebForms intentó hacer que pareciera que no era así para el desarrollador. – David

2

En función de una situación que podría salirse con este hack/solución:

private void Page_PreRender(object sender, System.EventArgs e) 
    { 
     if (IsPostBack && !IsCallback) 
     { 

      Response.Write("<html><head><script>location.replace('" + Request.Path + "');\n" + "</script></head><body></body></html>\n"); 

      Response.End(); 

     } 

    } 
Cuestiones relacionadas