ASP.NET: флажок на странице, скрытой UserControl, не остается проверенным, когда снова становится видимым - PullRequest
1 голос
/ 06 июля 2011

Вот настройки. У меня есть страница ASP.NET4 с включенным viewstate, с RadioButtonList с двумя переключателями, CheckBox и включенным UserControl. Я хочу скрыть флажок, если выбрана одна радиокнопка, и показать его, если выбрана другая. Я хочу, чтобы CheckBox сохранял свое состояние, когда он скрыт и повторно показан; если он был проверен перед скрытием, когда он снова отображается, я все еще хочу, чтобы он был проверен.

Суть в том, что код для отображения / скрытия CheckBox, в зависимости от того, какой переключатель выбран, находится в событии OnPreRender в UserControl. Таким образом, он выполняет Parent.FindControl () для получения элементов управления, а затем скрывает / показывает CheckBox в зависимости от состояния RadioButtonList.

Проблема заключается в том, что при выполнении этой логики в OnPreRender () UserControl флажок не сохраняет свое состояние после того, как он скрыт, а затем повторно показан. То есть, если флажок установлен, то я нажимаю переключатель, чтобы скрыть его, когда я нажимаю другой переключатель, я хочу, чтобы флажок все еще был установлен, когда он теперь отображается. У меня такое ощущение, что я не понимаю некоторые механизмы состояния представления, но когда я попытался добавить TextBox и скрыть / показать его, он сохранил свое текстовое значение, как и ожидалось.

Я могу переместить логику в Page_Load UserControl, и состояние флажка ведет себя, как и ожидалось. Но я пытаюсь заставить его работать в OnPreRender () или, по крайней мере, ищу объяснение, почему я вижу такое поведение.

В default.aspx:

 <asp:RadioButtonList runat="server" ID="uxRadio" AutoPostBack="true">
        <asp:ListItem Text="choice 1" Value="1"></asp:ListItem>
        <asp:ListItem Text="choice 2" Value="2"></asp:ListItem>
        <asp:ListItem Text="choice 3" Value="3"></asp:ListItem>
    </asp:RadioButtonList>
    <asp:CheckBox runat="server" ID="uxCheck" AutoPostBack="true" />
    <uc1:Control ID="uxControl" runat="server"></uc1:Control>

UserControl.ascx.cs:

protected override void OnPreRender(EventArgs e)
{
   RadioButtonList rb = (RadioButtonList)Parent.FindControl("uxRadio");
   CheckBox cb = (CheckBox)Parent.FindControl("uxCheck");

   if (rb.SelectedValue == "2")
   {
       cb.Visible = false;
   }
   else
   {
       cb.Visible = true;
   }
   base.OnPreRender(e);
 }

1 Ответ

1 голос
/ 06 июля 2011

Хорошо, я могу воспроизвести эту проблему, но я не уверен на 100%, почему ViewState не сохраняется.

Я предполагаю, что что-то подобное происходит:

ASP.NET извлекает проверенное состояние из CheckBoxes из опубликованного запроса, но только если он виден на стороне сервера (в противном случае он даже не будет отображаться как html). Если он невидим, он получает проверенное состояние из ViewState.

Я думаю, что PreRender UserControl в этом случае слишком поздно. ASP.NET не знает, что он должен сохранить это значение в ViewState, потому что условие (Visible-State) впоследствии изменяется. Следовательно, нет объявленного значения и значения ViewState, и ASP.NET должен использовать состояние по умолчанию (не проверено).

Если вы переместите этот код из PreRender в Page_Load, он будет работать.

Но я бы настоятельно рекомендовал перенести его на саму Страницу, потому что он действительно там находится. Пользовательский контроль не должен настаивать на существовании определенных элементов управления на своей странице, потому что он также должен работать на других страницах.

...