【问题标题】:ASP.NET: CheckBox in Page hidden by UserControl does not stay checked when made visible againASP.NET:被 UserControl 隐藏的页面中的复选框在再次可见时不会保持选中状态
【发布时间】:2011-07-06 06:26:35
【问题描述】:

这是设置。我有一个启用了视图状态的 ASP.NET4 页面,带有一个带有 2 个单选按钮的 RadioButtonList、一个 CheckBox 和一个包含的 UserControl。如果选择了一个单选按钮,我想隐藏 CheckBox,如果选择了另一个,我想显示它。我希望 CheckBox 在隐藏和重新显示时保持其状态;如果它在隐藏之前被检查过,当它再次显示时我仍然希望它被检查。

不同之处在于,根据选择的单选按钮显示/隐藏 CheckBox 的代码位于 UserControl 的 OnPreRender 事件中。所以它会通过 Parent.FindControl()s 来获取控件,然后根据 RadioButtonList 的状态隐藏/显示 CheckBox。

问题是,在 UserControl 的 OnPreRender() 中执行此逻辑时,复选框在隐藏后不保持其状态,然后重新显示。也就是说,如果选中了该复选框,那么我单击单选按钮将其隐藏,当我单击另一个单选按钮时,我希望该复选框在现在显示时仍被选中。我感觉我不了解某些视图状态机制,但是当我尝试添加 TextBox 并隐藏/显示它时,它确实按预期保持了它的文本值。

我可以将逻辑移动到 UserControl 的 Page_Load 并且复选框状态按预期运行。但我正试图让它在 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);
 }

【问题讨论】:

  • 请给我们看一些代码。为什么在 UserControl 中而不是在 Page 中显示/隐藏 CheckBox 的代码?
  • 将显示/隐藏代码移动到页面是一种选择,但由于各种遗留原因,逻辑存在于它所在的位置。在这一点上,我实际上对在当前设置下为什么会发生这种行为更感兴趣,即使唯一的解决方案是移动逻辑。在同一场景中的 TextBox 的行为似乎与 CheckBox 不同,这似乎很奇怪。
  • 没有任何源代码我只能猜测,你提到的场景不会导致 ViewStat 问题,因此我认为你的逻辑有问题。您是否在其他地方设置了 Checkbox-Checked 状态(例如缺少 PostBack 检查)?
  • 您可以使用花括号(代码示例按钮)格式化添加的源代码。
  • @Tim Schmelter 谢谢,我想我应该先测试发布代码,然后再在这里尝试。无论如何,如您所见,这似乎是非常简单的代码。在我的应用程序周围肯定有更多代码,但我创建了这个简单的测试页面来尝试提炼问题,但它仍然存在。

标签: asp.net user-controls viewstate


【解决方案1】:

好的,我可以重现这个问题,但我不能 100% 确定为什么不保留 ViewState。

我假设会发生这样的事情:

ASP.NET 从发布的请求中的 CheckBoxes 中检索选中状态,但前提是它在服务器端可见(否则它甚至不会呈现为 html)。如果它是不可见的,它会从 ViewState 获得检查状态。

我认为在这种情况下 UserControl 的 PreRender 为时已晚。 ASP.NET 不知道它必须将这个值保存在 ViewState 中,因为条件(可见状态)之后发生了变化。因此没有发布值和 ViewState 值,ASP.NET 必须使用默认状态(未选中)。

如果您将此代码从 PreRender 移动到 Page_Load,它就可以工作。

但我强烈建议将其移至页面本身,因为它确实属于那里。用户控件不应坚持在其页面中存在特定控件,因为它也应该在其他页面中工作。

【讨论】:

  • 是的,当然,将逻辑移至页面是最好的解决方案,也是我要做的。同样,这已经成为一个为什么会发生这种情况的问题,特别是因为文本框似乎没有表现出相同的行为(文本框似乎确实保持其状态)。无论如何,感谢您的帮助。
  • @Rob G:看看下面关于 ViewState 的令人筋疲力尽、有趣的文章:codeproject.com/KB/aspnet/aspnetviewstatepagecycle.aspxYyou 可能会提取相关信息。
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2021-09-05
  • 1970-01-01
相关资源
最近更新 更多