首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不受限制地自由显示和隐藏web表单的部分,以避免ViewState加载问题。

不受限制地自由显示和隐藏web表单的部分,以避免ViewState加载问题。
EN

Stack Overflow用户
提问于 2012-01-07 15:45:28
回答 3查看 12.6K关注 0票数 3

问题所在

我有一个网页表格,我想隐藏和显示一些面板。当我说"Panel“时,我指的不是Panel控件,而是html中的一个窗格(通常由一个DIV表示)。

我想像我希望的那样展示和隐藏这个面板..。无限制意味着不一定只有一个窗格必须是可见的,也可以是2,3或4。

通常,我是通过以下方式做到这一点的:

代码语言:javascript
复制
<div id="mypane1" runat="server">
  ...
</div>
<div id="mypane2" runat="server">
  ...
</div>
<div id="mypane3" runat="server">
  ...
</div>

这是:

代码语言:javascript
复制
this.mypane1.Visible = true;
this.mypane2.Visible = false;
this.mypane3.Visible = true;

不幸的是,这些面板包含控件,其中一些控件从一开始就没有显示出来(第一个web表单加载,所以当没有PostBack发生时)。这会导致ViewState加载的问题。

关于ViewState加载

当然,许多人显然会问我的这些ViewState问题。简单地说,事情是这样的:ViewState加载错误并不容易管理,但最后我可以理解以下内容。

让我们假设这个:

代码语言:javascript
复制
<!-- 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 2控件关联的每个事件都会发生相同的情况。lb4是按下的,没有问题。

问题是,开始层次结构是由窗格1和3中的控件表示的。当事件由控件引发时(如果开始层次结构不是部分的话),则发现ViewState不一致(因为我在HtmlControls上操作,通常ServerControls更智能,当在其中添加控件时,ServerControls可以管理更好的ViewState )。

可行溶质

请注意,我可以简单地做以下操作来隐藏和显示面板:

代码语言:javascript
复制
this.mypane2.Attributes.Add("display", "none");

我不想这样做,原因有二:

  • 我不希望窗格被呈现为Html。
  • 我想使用服务器控件。

请求

我需要使用web控件来管理我的面板管理,我不能使用HtmlControl的,因为控件层次结构没有正确加载。

我尝试过MultiView和view控件,但它们只允许我使用一个活动视图。我该怎么做?

注意:请不要过于关注ViewState问题,这只是一个很好的方法,让您知道发生了什么,我唯一的兴趣是找到一种方法来使用服务器控件自由隐藏和显示窗格。

谢谢你

EN

回答 3

Stack Overflow用户

发布于 2012-01-07 16:05:42

我假设将面板的可见性设置为false会导致儿童不会被添加到ViewState中,也不会以某种方式与其混为一谈。对吗?

考虑到这一点,如果您想在.Net呈现引擎方面拥有控件,但对最终用户隐藏,则可以尝试使用css显示和隐藏它们。

显示

代码语言:javascript
复制
pnlDemo.Attributes.Add("style", "display:block");

隐藏

代码语言:javascript
复制
pnlDemo.Attributes.Add("style", "display:none");

我遇到了需要ASP.Net控件用于ViewState的情况,但没有显示出来。在适当的时候,我将向他们展示如何使用JQuery,并且这个方法适用于该场景,因此它可能适用于您的场景。

票数 2
EN

Stack Overflow用户

发布于 2012-01-08 03:29:32

你试过使用ViewStateModeByIdAttribute

ViewStateModeByIdAttribute类用于指定需要按ID加载视图状态的控件。默认的视图状态加载行为是由ASP.NET通过页面控件树中的索引加载控件的视图状态信息。按ID加载视图状态信息需要付出性能代价,因为在加载其视图状态信息之前,必须专门搜索页面控件树。

票数 1
EN

Stack Overflow用户

发布于 2014-08-05 01:19:38

你试过用page.RegisterStartupScript吗?脚本将在页面加载结束时加载,因此控件将拥有它们的viewstate。编写JavaScript代码,获取面板的id以隐藏&将CSS更改为可见性、隐藏,而不是显示。

要在其中显示面板的另一个asp按钮。您可以编写JavaScript代码onClientClick事件按钮以更改面板的CSS以更改其可见性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8770859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档