3

问题

我有一个网络表单,我想隐藏和显示一些面板。当我说“面板”时,我指的不是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 控件来管理我的面板管理,我不能使用HtmlControls,因为没有正确加载 Control Hierarchy。

我尝试MultiView了查看控件,但它们使我只能使用一个活动视图。我能怎么做?

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

谢谢

4

3 回答 3

2

我假设将面板的可见性设置为 false 会导致子级不会被添加到 ViewState 或以某种方式干扰它。那是对的吗?

鉴于此,如果您想在 .Net 渲染引擎方面拥有控件但对最终用户隐藏,您可以尝试使用 css 显示和隐藏它们,即

节目

pnlDemo.Attributes.Add("style", "display:block");

隐藏

pnlDemo.Attributes.Add("style", "display:none");

我有一种情况,我需要 ASP.Net 控件用于 ViewState 目的,但未显示。在适当的时候,我会使用 JQuery 向他们展示,这种方法适用于该场景,因此它可能适用于您的场景。

于 2012-01-07T16:05:42.950 回答
1

您是否尝试过使用ViewStateModeByIdAttribute

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

于 2012-01-08T03:29:32.173 回答
0

您是否尝试过 page.RegisterStartupScript 。脚本将在页面加载结束时加载,因此控件将具有其 viewstate 。编写获取面板 id 的 JavaScript 代码以隐藏并将 CSS 更改为可见性隐藏而不显示不显示。

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

于 2014-08-05T01:19:38.750 回答