繁体   English   中英

asp.net面板在回发时丢失viewstate

[英]asp.net panel loses viewstate on postback

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

<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自动重新创建的。 由于客户端和服务器之间的通信是无状态且已断开连接,因此所有变量都在页面生命周期的末尾进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM