volver retroceso net navegador flechas evitar detectar deshabilitar controlar boton bloquear atras asp asp.net browser back-button

asp.net - retroceso - detectar boton atras del navegador javascript



Cómo encontrar si el usuario hace clic en el botón Atrás del navegador o en el botón Actualizar (7)

En primer lugar, dar mensajes de error si los usuarios usan Atrás o tienen que actualizar una página por cualquier razón, es una muy mala idea. En cambio, debes tratar de forma transparente con eso. Piense en una página que no aparece por completo debido a problemas en el nivel de transporte: la única opción que tiene el usuario es volver a cargar o volver atrás.

Para responder a su pregunta, debe realizar un seguimiento de la navegación del usuario, es decir, en el lado del servidor. Olvídate de Java-Script aquí. Si el usuario visita un sitio web, puede almacenar esa información en una sesión asociada al usuario (hay varios métodos para mantener estas sesiones únicas, y no entraré en detalles aquí). Si almacena en sus estructuras internas las páginas que el usuario visitó recientemente, es fácil determinar si una página se ha visitado dos veces, o si la navegación está en la dirección "incorrecta".

Podría generalizar fácilmente esto (y hacer todo más robusto, por ejemplo, contra usuarios que saltan salvajemente entre direcciones URL o retroceder más de un paso a la vez) construyendo un gráfico de navegación "permitida" y recorriéndolo mientras el usuario está visitando sitios web.

El comportamiento correcto, entonces, si el usuario está haciendo una navegación "incorrecta" (como retroceder, volver a cargar == visitar dos veces) es volver a encarrilarlo. ¡No dar un mensaje de error del que no puede escapar! Como no puede volver a cargar o regresar, no le quedan opciones.

Necesito encontrar si el usuario hace clic en el botón Atrás del navegador o en el botón Actualizar.

Necesito redireccionar la página a la página de Error cuando hace clic en el botón de volver o actualizar. Como hacer esto.

Necesito hacer esto en JavaScript para mi página ASP.net


No puedes. El navegador no envía sus propios eventos ui al servidor. Todo lo que obtienes son solicitudes de http y una se parece bastante a otra. Tal vez haga clic en el botón Atrás o tal vez simplemente hayan tecleado la última URL. Díganos qué problemas está causando y podemos ayudarlo a adaptar su proyecto para trabajar con el protocolo http un poco mejor.


Supongo que quiere hacer esto debido a la devolución posterior para evitar volver a enviar alguna acción o datos ¿no? irónicamente, este no era un gran problema antes de los formularios web de asp.net ... porque generalmente tenía que publicar en una URL diferente en lugar de la misma (al igual que asp.net mvc en realidad).

Un truco que me gustaba usar ... aunque en los puntos más técnicos es más lento ... era tener una página de entrada y una página de entrada. El resultado HTML de la página de publicación era un HTML supermínimo con un pequeño javascript que reemplazaba la url actual (de la página de publicación) en el historial del navegador con la página de resultados (o incluso la página de referencia original si realmente quería). El resultado fue cuando el usuario hacía clic en el botón Atrás, se lo enviaba a la página de entrada original, o si hacía clic en actualizar, ya estaría en la nueva página de resultados.

<html><body onload="location.replace(''someURL.asp'')"></body></html>


Lo hicimos en Java / Struts1 al poner una propiedad en el botón de enviar. Si se hizo clic en el botón Enviar, el texto del botón se enviaría en la propiedad en ActionForm. Si el usuario actualizó la información, no se estableció el valor, por lo que sabíamos que el usuario no había hecho clic en el botón. En este caso, donde la propiedad estaba vacía, volvimos y mostramos la primera página del flujo de página. YMMV en ASP.Net.


.NET 3.5 puede manejar muy bien los botones de navegación hacia atrás (y hacia adelante). Busque con Google: "Scriptmanager EnableHistory". Puede controlar qué acciones del usuario agregarán una entrada al historial del navegador (ScriptManager -> AddHistoryPoint) y su aplicación ASP.NET recibirá un evento cada vez que el usuario haga clic en los botones Atrás / Adelante del navegador.


Implemente un PageToken usando un guid / o sello de tiempo almacenado en sesión y compare el valor con un campo oculto en el formulario. Hice esto a través de una clase de PageToken . Si el valor del campo oculto y la variable de sesión no coinciden, entonces estará fuera de sincronización y usted se encargará de eso. El truco es mapear todos los eventos en su página.

public void GeneratePageToken() { SessionVariables currSession = new SessionVariables(); hfMasterPageToken.Value = System.DateTime.Now.ToString(); currSession.PageToken = hfMasterPageToken.Value; } public string GetLastPageToken { get { SessionVariables currSession = new SessionVariables(); return currSession.PageToken; } } public bool TokensMatch { get { SessionVariables currSession = new SessionVariables(); return (currSession.PageToken != null && currSession.PageToken == hfMasterPageToken.Value); } }

En su método de Evento antes de su código regular:

if (this.TokensMatch == false) { //Reload the data. //Generates a NewPageToken (this.GeneratePageToken();) ReloadDataMethod(); this.MessageToUser = "Data reloaded. Click Edit or Insert button to change."; this.MessageType = MessageToUserType.Success; this.DisplayMessageToUser = true; return; }


Con Site.Master

En su Site.Master , ponga después de <body>

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" /> <dx:ASPxLoadingPanel ID="MainLoadingPanel" runat="server" ClientInstanceName="MainLoadingPanel" Modal="True" /> <input type="hidden" id="refreshed" value="no" /> <script type="text/javascript" language="javascript"> MainLoadingPanel.Show(); window.onload = function () { var e = document.getElementById("refreshed"); if (e.value == "no") { MainLoadingPanel.Hide(); e.value = "yes"; } else { e.value = "no"; location.reload(true); // Reload the page or redirect... } }; </script>

Sin Site.Master

En tu código común, pon después de <body>

<input type="hidden" id="refreshed" value="no" /> <script type="text/javascript" language="javascript"> window.onload = function () { var e = document.getElementById("refreshed"); if (e.value == "no") { e.value = "yes"; } else { e.value = "no"; location.reload(true); // Reload the page or redirect... } }; </script>