【问题标题】:asp.net panel loses viewstate on postbackasp.net 面板在回发时失去视图状态
【发布时间】:2015-01-26 13:08:37
【问题描述】:

我有一个带有更新面板的网页。 在更新面板中,我有一个带有这样的用户控件的面板:

<asp:UpdatePanel ID="updatePanel" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
<ContentTemplate>
    <asp:Panel ID="pnlFiles" runat="server" EnableViewState="true">
        <files:FilesControl runat="server" ID="filesControl" />
    </asp:Panel>
</ContentTemplate>

我有一个复选框列表,每当用户选中其中一个时,我都想在该面板中添加另一个 FilesControl 所以我这样做:

FilesControl files = (FilesControl)LoadControl("~/UserControls/FilesControl.ascx");
files.ID = XXX;
pnlFiles.Controls.Add(files); 

但是在每次回发(每个复选框都选中)时,面板都会丢失最后一个状态,并且添加的控件会被清除,因此面板实际上每次都会返回到其初始状态,我无法向其添加越来越多的控件。 我启用了视图状态,但没有帮助。 我在这里错过了什么?

【问题讨论】:

  • 是否在Page_InitPage_Load 的每个回发时将控件添加到页面中,并使用与以前相同的ID?
  • ID是唯一的,我自己生成的。我在复选框选中更改事件chkCompare_CheckedChanged 上添加控件
  • 虽然在事件中动态添加控件非常好,但有必要在后续回发时重新创建此控件。这必须最迟在Page_Load 中完成(更好的是:Page_Init)。因此,您需要将已添加的控件存储在某个地方,以便能够重新创建它们。也许将控制计数存储在ViewState 中就足够了。
  • 但是面板是硬编码的,我向它添加了控件,所以它不应该有自己的视图状态,他将添加到它的控件存储在其中吗?我可以尝试管理自己的视图状态,但如果面板已经拥有自己的视图状态,这似乎是不对的。没有?
  • 控件的视图状态不用于持久化动态控件。它只是用来存储 f.e. TextBoxText 属性(如果它没有默认值)。

标签: c# asp.net


【解决方案1】:

根据要求,我的 cmets 作为答案:

您需要在Page_InitPage_Load(最迟)的每次回发时将控件添加到页面,并使用与以前相同的 ID。

ID 是唯一的,我生成它。我在复选框上添加控件 检查更改事件 chkCompare_CheckedChanged

虽然在事件中动态添加控件非常好,但有必要在后续回发时重新-创建此控件。这必须最迟在Page_Load 中完成(更好的是:Page_Init)。因此,您需要将已添加的控件存储在某个地方,以便能够重新创建它们。也许将控制计数存储在ViewState 中就足够了。

所以我应该将我添加的控件存储在 ViewState 对象中并 然后将它们重新添加到 Page_Load 的面板中?

不,您不应该将控件存储在ViewState 中,而是将重新创建它们所必需的信息 存储。你怎么知道你需要添加什么?当然你也可以使用像RepeaterDataListGridView这样的webdatabound控件,你只需要分配一个DataSource,持久化的东西就会自动为你完成。

即使您以声明方式(在 aspx 上)添加所有控件,也是如此。但是这些控件是由 ASP.NET 自动重新创建的。由于客户端和服务器之间的通信是无状态的,并且是断开的,因此所有变量都放置在页面的末尾life-cycle

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多