Asp.net 不受限制地自由显示和隐藏web表单的部分,以避免ViewState加载问题 问题
我有一个web表单,我想隐藏和显示一些面板。当我说“Panel”时,我不是指Asp.net 不受限制地自由显示和隐藏web表单的部分,以避免ViewState加载问题 问题,asp.net,viewstate,failed-to-load-viewstate,Asp.net,Viewstate,Failed To Load Viewstate,我有一个web表单,我想隐藏和显示一些面板。当我说“Panel”时,我不是指Panel控件,而是指html中的一个窗格(通常由DIV表示) 嗯,我想显示和隐藏这个面板,因为我希望。。。无限制意味着不必只有一个窗格必须可见,2、3或4也可以可见 我通常通过以下方式实现这一目标: <div id="mypane1" runat="server"> ... </div> <div id="mypane2" r
Panel
控件,而是指html中的一个窗格(通常由DIV表示)
嗯,我想显示和隐藏这个面板,因为我希望。。。无限制意味着不必只有一个窗格必须可见,2、3或4也可以可见
我通常通过以下方式实现这一目标:
<div id="mypane1" runat="server">
...
</div>
<div id="mypane2" runat="server">
...
</div>
<div id="mypane3" runat="server">
...
</div>
不幸的是,这些面板包含控件,其中一些控件没有从一开始就显示出来(第一次web表单加载,因此当没有回发时)。这会导致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) {
...
}
我不想这样做,原因有二:
- 我希望窗格不呈现为Html
- 我想使用服务器控件
要求
我需要使用web控件来管理面板管理,我无法使用HtmlControl
s,因为控件层次结构未正确加载
我尝试了多视图
和视图控件,但它们只允许我使用一个活动视图。我该怎么办
注意:请不要过于关注ViewState
问题,这只是一个很好的说明,让您知道发生了什么,我唯一感兴趣的是找到一种使用服务器控件自由隐藏和显示窗格的方法
谢谢我假设将面板的Visibly设置为false会导致子对象不会被添加到ViewState或以某种方式与之交互。对吗
考虑到这一点,如果您希望在.Net渲染引擎中有控件,但对最终用户隐藏,您可以尝试使用css显示和隐藏它们,即
展示
pnlDemo.Attributes.Add("style", "display:block");
隐藏
pnlDemo.Attributes.Add("style", "display:none");
我曾经遇到过这样一种情况:出于ViewState的目的,我需要ASP.Net控件,但没有显示出来。在适当的时候,我会向他们展示使用JQuery的方法,这种方法适用于该场景,因此它可能适用于您的场景 您是否尝试过使用
ViewStateModeByIdAttribute类用于指定需要按ID加载视图状态的控件。默认视图状态加载行为是ASP.NET通过其在页控件树中的索引加载控件的视图状态信息。按ID加载视图状态信息会带来性能损失,因为在加载控件的视图状态信息之前,必须在页控件树中专门搜索该控件
您是否尝试过page.RegisterStartupScript。
脚本将在页面加载结束时加载,以便控件具有其viewstate。
编写JavaScript代码,获取要隐藏的面板id并将CSS更改为visibility hidden not display none
要在其上显示面板的另一个asp按钮。
您可以在ClientClick事件的按钮上编写JavaScript代码来更改面板的CSS以更改其可见性。您说过这会导致ViewState加载问题。请在这方面添加更多细节。
pnlDemo.Attributes.Add("style", "display:block");
pnlDemo.Attributes.Add("style", "display:none");