2009-08-20 7 views
6

Soy relativamente nuevo en el desarrollo web ASP.Net &, así que tengan paciencia conmigo. Durante las pruebas de nuestras páginas web, noté que si un usuario pulsaba "Actualizar/Volver a cargar" y hacía clic en "Reintentar" cuando se le solicitaba en el cuadro de diálogo "Reenviar información", cualquier último evento que se disparara antes de que el usuario lo eligiera para "Refrescar", se volverá a disparar de nuevo.
Como ejemplo, tenemos los botones de navegación "Anterior" y "Siguiente" que permiten al usuario navegar a través de una serie de preguntas. Si el operador pulsa "Actualizar/Recargar", cualquier botón de navegación que el usuario haya pulsado se disparará nuevamente. Esto realmente tiene sentido, pero el efecto neto es que el usuario termina en la página siguiente o anterior desde la que antes estaba viendo. ¿Hay una solución alternativa para este tipo de cosas?¿Efecto secundario de actualización/recarga con ASP.net?

+0

Ver: http://stackoverflow.com/questions/743580/page-refresh-causes-duplicate-post-in-asp-net-applications – Shog9

Respuesta

4

Esto se debe a la forma en que está manipulando PostBacks.

Un poco de historia es necesaria:

La web es "sin estado", lo que significa que cada petición de un cliente a un servidor es independiente de la solicitud antes de que la solicitud o después de ella. No hay un "estado" mantenido. Si observa el nivel de HTTP, es simplemente un blob de texto enviado al servidor que dice "envíeme esta información" y el servidor lo envía de vuelta. No hay "Yo soy el mismo usuario que estaba aquí hace 3 minutos y me gustaría pasar a la página siguiente desde la que estaba la última vez que hablamos".

La manera en que ASP.NET resuelve este problema usa ViewState y devoluciones. Cada vez que hace clic en un botón ASP.NET, en realidad está enviando un formulario que tiene un campo oculto con un montón de datos codificados. Esa información contiene todos de la información que el servidor necesita para "reconstruir" el estado de la página tal como fue la última vez. Luego puede ejecutar el "movimiento a la página siguiente" y ese comando tiene sentido. Cuando ASP.NET envía el HTML de vuelta al cliente, actualiza ese campo oculto con nuevos datos, representando de nuevo el estado de la página, tal como está ahora. Y la próxima vez que haga clic en cualquier botón, los datos se envían nuevamente, la página se reconstruye nuevamente y el ciclo se repite.

Cuando el usuario pulsa "actualizar", el navegador le pregunta si desea volver a enviar el formulario. Están volviendo a enviar la misma información que hicieron la última vez.

Implicaciones para usted:

Si intenta realizar un seguimiento de los datos sobre el usuario o lo que están haciendo con independencia de la ViewState de ASP.NET, que tendrá que asegurarse de que se sincronizan que cada vez que la página procesos.

Es posible que desee mantener la "página actual" en ViewState:

ViewState.Add("CurrentPage", intCurrentPage); 

Así que cuando se llama al manejador MoveNext caso, puede estar seguro de que se están moviendo en relación con la página, ya que fue la última vez fue enviado al cliente

+0

Muchas gracias, muy útil. –

1

Puede mirar hacia el patrón Post-Redirect-Get que se usa con más frecuencia en asp.net mvc.

Ver here para más detalles.

+0

Esa es una buena técnica para mitigar las nuevas presentaciones de formularios reales, pero no estoy seguro de si sería una buena idea usarla para lo que es esencialmente cada solicitud en una aplicación WebForms de alto perfil. Eso duplica la cantidad de solicitudes en toda la aplicación. –

+0

El OP no mencionó nada sobre "con gran estado de alerta", es solo su suposición y, a menos que tenga> 200 solicitudes por segundo, su infraestructura apenas notaría el viaje adicional de ida y vuelta. Para deshacerse de esos diálogos y los peligros del reenvío, vale la pena el trabajo adicional. – redsquare

+0

Si nota que SO usa la misma técnica. No veo muchos problemas de rendimiento aquí, ¡y se lo busca más de unas pocas veces por segundo! – redsquare

Cuestiones relacionadas