【发布时间】: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