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

时间:2015-01-26 13:08:37

标签: c# 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); 

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

1 个答案:

答案 0 :(得分:2)

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

您需要在Page_InitPage_Load(最晚)的每个回发中将控件添加到页面中,并使用与之前相同的ID。

  

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

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

  

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

上的面板中

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

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