asp.net 面板在回发时失去视图状态



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

<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中就足够了。

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

不可以,不应将控件存储在ViewState中,而应将重新创建控件所需的信息存储在控件中。您如何知道需要添加什么?当然,您也可以使用Webdatabound控件,例如RepeaterDataListGridView,您只需要分配一个DataSource,并且持久化的内容会自动为您完成。

这就是对所有控件执行的操作,即使您以声明方式添加它们(在 aspx 上)。但这些控件是由 ASP.NET 自动重新创建的。所有变量都在页面生命周期结束时释放,因为客户端和服务器之间的通信是无状态且断开连接的。

最新更新