问题
我有一个网络表单,我想隐藏和显示一些面板。当我说“面板”时,我指的不是Panel
控件,而只是 html 中的一个窗格(通常由 DIV 表示)。
好吧,我想按照我的意愿显示和隐藏这个面板......没有限制意味着不一定只有一个窗格必须是可见的,也可以是 2、3 或 4。
通常我是通过以下方式实现的:
<div id="mypane1" runat="server">
...
</div>
<div id="mypane2" runat="server">
...
</div>
<div id="mypane3" runat="server">
...
</div>
和这个:
this.mypane1.Visible = true;
this.mypane2.Visible = false;
this.mypane3.Visible = true;
不幸的是,这些面板包含控件,其中一些从一开始就没有显示(第一次加载 Web 表单,所以当没有PostBack
发生时)。这会导致ViewState
加载问题。
关于 ViewState 加载
当然,很多人显然会问ViewState
我的这些问题。好吧,简而言之,事情是这样的:ViewState
加载错误不容易管理,但最后我可以理解以下内容。
假设有这个:
<!-- In .aspx -->
<div id="mypane1" runat="server">
...
<asp:Literal ID="..." runat="server" ...></asp:Literal>
<asp:TextBox ID="..." runat="server" ...></asp:TextBox>
...
</div>
<div id="mypane2" runat="server">
...
<asp:LinkButton ID="lb1" OnClick="lb1_Click" runat="server" ...></asp:LinkButton>
<asp:LinkButton ID="lb2" OnClick="lb2_Click" runat="server" ...></asp:LinkButton>
<asp:LinkButton ID="lb3" OnClick="lb3_Click" runat="server" ...></asp:LinkButton>
...
</div>
<div id="mypane3" runat="server">
...
<asp:TextBox ID="..." runat="server" ...></asp:TextBox>
<asp:LinkButton ID="lb4" OnClick="lb4_Click" runat="server" ...></asp:LinkButton>
<asp:TextBox ID="..." runat="server" ...></asp:TextBox>
...
</div>
// In .aspx.cs
protected void Page_Load(...) {
if (!this.IsPostBack) {
this.mypane1.Visible = true;
this.mypane2.Visible = false;
this.mypane3.Visible = true;
}
}
/// ... In the page many happens and the panes are shown and hidden ... ///
// Event Handlers
protected void lb1_Click(object sender, EventArgs e) {
...
}
protected void lb2_Click(object sender, EventArgs e) {
...
}
protected void lb3_Click(object sender, EventArgs e) {
...
}
protected void lb4_Click(object sender, EventArgs e) {
...
}
那么问题如下。
开始处没有显示pane2。
在显示一些操作之后,pane2 及其控件也显示出来。
用户单击 lb1 -->
ViewState error
请注意,与pane2 控件关联的每个事件都会发生同样的情况。是按lb4,没问题。
问题是开始层次结构由窗格 1 和 3 中的控件表示。当控件引发事件时,如果开始层次结构不属于部分,ViewState
则发现不一致(因为我采取行动HtmlControls
,通常ServerControls
更智能,并且可以在控件时更好地管理 ViewState被添加到其中)。
可行的解决方案
请注意,我可以简单地执行以下操作来隐藏和显示面板:
this.mypane2.Attributes.Add("display", "none");
这不是我想做的事情,原因有两个:
我希望窗格不呈现为 Html。
我想使用服务器控件。
要求
我需要使用 web 控件来管理我的面板管理,我不能使用HtmlControl
s,因为没有正确加载 Control Hierarchy。
我尝试MultiView
了查看控件,但它们使我只能使用一个活动视图。我能怎么做?
注意:请不要过分关注这个ViewState
问题,它只是让你知道发生了什么的好描述,我唯一的兴趣是找到一种使用服务器控件自由隐藏和显示窗格的方法。
谢谢