У меня есть страница ASP.NET, которая содержит два div. Оба имеют поля поиска и кнопки поиска, содержащиеся в каждом из них. Когда я впервые захожу на эту страницу, у Div A есть класс 'SearchDiv', а у Div B есть 'SearchDivDisabled'. Эти классы изменяют внешний вид, чтобы пользователь знал, какой тип поиска они в данный момент активировали.
Когда нажимается Div B, JavaScript меняет свой класс на «SearchDiv» и изменяет «Div A» на «SearchDivDisabled». Это все работает как шарм. У меня проблема, когда пользователь переключается на Div B, нажимает кнопку поиска Div B (которая, очевидно, перенаправляет на страницу результатов), а затем использует кнопку назад браузера. Когда они возвращаются на страницу поиска, Div A снова включается, а Div B отключается, хотя они в последний раз использовали Div B. В обработчике событий кнопки поиска я устанавливаю атрибут класса Div перед перенаправлением, надеясь, что это обновит страница на сервере, поэтому, когда пользователь вернется, его последний включенный Div будет по-прежнему включен (независимо от того, какой из них был включен при первом посещении страницы).
Я считаю, что это касается ViewState, но я не уверен, почему атрибут класса не сохраняется, поэтому, когда пользователь возвращается на страницу, он восстанавливается. Есть ли что-то, что я здесь упускаю, или какой-то простой способ гарантировать поведение, которое я хочу? Спасибо!
Редактировать: вот код обработчика события кнопки:
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()
вызывается из фактического обработчика события кнопки с перечислением, представляющим выбранную панель поиска и URL страницы результатов. SearchContainers - это словарь, отображающий целое число в поисковый элемент Div. Важным кодом является последняя строка, в которой я обновляю выбранный поисковый контейнер с помощью «активного» класса поиска, а не отключенного (который я назначаю другим элементам)
Дополнительное обновление: Я боролся с этой проблемой последние пару дней. Я был в состоянии заставить следующий код работать (в page_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.
Но это действительно не решение, поскольку все остальное, что правильно кэшируется, теряется, что оставляет меня в худшем положении, чем когда я начинал. Все остальное, кажется, сохраняется хорошо, только класс div вызывает у меня борьбу.
Редактировать: Просто хотел обновить это для всех, кто сталкивался с этим. Хотя я полагаю, что здесь есть решение с настройкой кэшируемости страницы, чтобы заставить браузер выполнять обратную передачу, я не мог заставить ее работать на 100% со всеми браузерами (в основном Firefox давал мне припадки, что является задокументированной ошибкой). Я действительно верю, что решение для файлов cookie будет работать, но я чувствовал, что это может быть немного сложнее, чем необходимо, просто пытаясь сохранить состояние пары div.
Я закончил тем, что привязал класс div к состоянию его коррелирующей радиокнопки (рядом с div есть радиокнопки, которые позволяют пользователям более наглядно включать панели поиска). Я заметил, что эти переключатели сохранили правильное проверенное значение при использовании кнопки «назад», поэтому я мог гарантировать, что они будут указывать правильный div, который будет включен. Таким образом, в загрузке JavaScript я проверяю, какая радио-кнопка включена, и затем корректирую классы поисковых элементов соответственно. Это довольно большой взлом, но он работает на 100% во всех браузерах и занимает всего около 10 строк JavaScript.