Состояние переключателя ASP.NET и клавиша возврата - PullRequest
3 голосов
/ 04 мая 2010

У меня есть страница ASP.NET с двумя переключателями. Кнопки используют авто-постбэк для запуска логики на стороне сервера. Если вы выберете вторую кнопку, страница вернется назад и правильно отобразит сообщение о выборе второй кнопки. Если теперь нажата кнопка «Назад» в браузере, состояние кнопки 2 остается проверенным, пока в сообщении не будет указано, что кнопка 1 отмечена. Это приводит к ситуации, которая явно нежелательна, поскольку состояние переключателей и сообщений теперь не синхронизировано. Я знаю, что это проблема с кэшированием, но я нахожу странным, что браузер запоминает предыдущее состояние метки, но не предыдущее состояние переключателя.

Как лучше всего справиться с этой ситуацией? В этой ситуации нежелательно отключать кэш или использовать кнопку возврата.

Следующий пример кода демонстрирует это поведение:

[Форма:]

    <asp:RadioButton ID="rb1" runat="server" AutoPostBack="true" Text="Button1" OnCheckedChanged="rb_CheckedChanged"
        GroupName="rbgroup" Checked="true" />
    <br />
    <asp:RadioButton ID="rb2" runat="server" AutoPostBack="true" Text="Button2" OnCheckedChanged="rb_CheckedChanged"
        GroupName="rbgroup" />
    <br />
    <hr />
    <asp:Label ID="lbl1" runat="server">Button 1</asp:Label>

[Код сзади:]

protected void rb_CheckedChanged(object sender, EventArgs e)
{
    if (rb1.Checked == true)
        lbl1.Text = "Button 1";
    else
        lbl1.Text = "Button 2";
}

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Ваш вопрос очень прост.

  1. В вашей разметке вы можете использовать check = "false" или любой другой эквивалент asp.net ....

  2. При загрузке страницы убедитесь, что вы используете if (! IsPostBack) {// установите значение вашей группы. } чтобы установить значения переключателя из источника данных или значения по умолчанию при первой загрузке страницы. Каждое последующее время будет исключено.

Итак, вот пример:

if(!IsPostBack)
{
   rb1.Checked = false;
   rb2.Checked = false;

   //or alternatively set the value from server data
}
  1. В случае нажатия кнопки «Назад» браузер уже кэшировал страницу. Поскольку ни один из флажков не помечен как флажок = «ложь» в вашей разметке или в вашем коде, браузер загрузит состояние страницы, как оно есть, из кэша.

Если вы хотите изменить, какой переключатель выбран, используйте # 2, чтобы установить значение группы, поскольку событие PageLoad выполняется перед предварительным рендерингом и визуализацией.

0 голосов
/ 06 мая 2010

Хм - это смешно.

Я могу воспроизвести это. И что меня удивляет, так это то, что источник (просмотр источника в браузере) показывает правильный переключатель (кнопка 1). Браузер (я проверял IE и FF), кажется, неправильно отображает источник (или не перерисовывает переключатель, или не показывает правильный источник).

Теперь вещь с кнопкой "Назад" немного хитрая. Главным образом потому, что вы ничего не можете с этим поделать ... HTTP есть и останется без состояния, а кнопка "Назад" на клиенте "далеко" от вашего веб-сервера. Вы не можете это контролировать.

В качестве статьи о подобной теме вы можете прочитать Тщательное изучение «Отключения кнопки Назад» .

Что я пытаюсь сказать, так это то, что, хотя я не понимаю, почему браузер отображает что-то отличное от того, что говорит источник, я боюсь, что вы ведете здесь проигрышную битву.

Единственное, о чем я сейчас могу думать, - это найти какой-нибудь умный JavaScript, который я не могу предоставить, который «что-то делает», чтобы браузер перерисовывал экран после того, как пользователь нажал кнопку «Назад».

...