Tengo una página ASP.NET que contiene dos div. Ambos tienen campos de búsqueda y un botón de búsqueda dentro de cada uno de ellos. Cuando llego por primera vez a esta página, Div A tiene la clase 'SearchDiv', mientras que Div B tiene 'SearchDivDisabled'. Estas clases cambian la apariencia para que el usuario sepa qué tipo de búsqueda tienen habilitado actualmente.Clase de Div no persiste cuando se usa el botón 'atrás'
Cuando se hace clic en Div B, JavaScript cambia su clase a 'SearchDiv' y cambia Div A a 'SearchDivDisabled'. Todo esto funciona como un encanto. El problema que tengo es cuando un usuario cambia a Div B, hace clic en el botón de búsqueda de Div B (que obviamente redirige a una página de resultados), y luego utiliza el botón de retroceso del navegador. Cuando vuelven a la página de búsqueda, Div A se habilita nuevamente, y Div B se desactiva, aunque usaron Div B. En el controlador de eventos del botón de búsqueda, establecí el atributo de clase de las Divs antes de redireccionar, esperando que esto se actualice la página en el servidor, de modo que cuando el usuario regrese, su última Div habilitada aún estará habilitada (independientemente de cuál se activó cuando se visitó la página por primera vez).
Creo que esto implica ViewState, pero no estoy seguro de por qué el atributo de clase no se guarda, por lo que cuando el usuario regresa a la página se restaura. ¿Hay algo que me falta aquí, o alguna forma fácil de garantizar el comportamiento que quiero? ¡Gracias!
Editar: Aquí está el botón de código de controlador de eventos:
protected void RedirectToResults(int searchEnum, string resultPage)
{
ShowContainer(searchEnum);
Response.Redirect(resultPage + this.webParams.getAllVariablesString(null));
}
protected void ShowContainer(int searchContainerToShow)
{
if (searchContainerToShow < 0 || searchContainerToShow > SearchContainers.Count || SearchContainers.Count == 0)
return;
//disable all search panels
foreach (SearchContainer container in SearchContainers.Values)
{
container.searchDiv.Attributes.Add("class", "SearchDivDisabled");
}
//enable selected panel
SearchContainers[searchContainerToShow].searchDiv.Attributes.Add("class", "SearchDiv");
}
RedirectToResults()
se llama desde el controlador de eventos botón real con la enumeración que representa el panel de búsqueda seleccionado y la URL de la página de resultados. SearchContainers es un diccionario que asigna un número entero a la Div de búsqueda. El código importante es la última línea, donde estoy actualizando el contenedor de búsqueda seleccionado con la clase de búsqueda 'activa', en lugar de la desactivada (que asigno a los otros divs)
Actualización adicional: He estado batallando con este problema durante los últimos días. Yo era una especie de poder conseguir el siguiente código para trabajar (en Load):
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
Pero esto en realidad no es una solución, como todo lo demás que consigue en caché correctamente se pierde, lo que me deja peor que cuando Yo empecé. Todo lo demás parece persistir bien, es solo la clase de div lo que me está causando dificultades.
Editar: Solo quería actualizar esto para cualquier otra persona que encuentre esto. Aunque creo que hay una solución aquí con la configuración de la caché de la página para obligar al navegador a la devolución de datos, no pude hacerlo funcionar al 100% con todos los navegadores (principalmente Firefox me estaba dando ataques, que es un error documentado). Creo que la solución de cookies funcionaría, pero creo que puede ser un poco más compleja de lo necesario para tratar de almacenar el estado de un par de div.
Lo que terminé haciendo fue vincular la clase de div al estado de su botón de radio relacionado (hay botones de opción al lado del div que permiten a los usuarios una forma más visual de habilitar los paneles de búsqueda). Me di cuenta de que estos botones de opción conservaban el valor de verificación correcto cuando se usaba el botón Atrás, por lo que podía garantizar que indicaran la habilitación del div correcto. Entonces en la carga de JavaScript, verifico qué botón de radio está habilitado, y luego ajusto las clases de los divs de búsqueda en consecuencia. Este es un truco muy grande, pero ha funcionado al 100% en todos los navegadores, y solo tomó alrededor de 10 líneas de JavaScript.
Como menciono anteriormente, 'En el controlador de eventos del botón de búsqueda establezco el atributo de clase de las Divs antes de redireccionar, esperando que esto actualice la página en el servidor para que cuando el usuario regrese, su última Div habilitada siga siendo habilitado 'Así que estoy haciendo esto.Actualizaré la publicación original con el código. – Kevin