[英]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_Init
或Page_Load
每个回发页面上(最晚),并且具有与以前相同的ID。
ID是唯一的,我会生成它。 我将控件添加到复选框选中的更改事件chkCompare_CheckedChanged
虽然在事件中动态添加控件是完全可以的,但有必要在后续的回发中重新创建此控件。 这必须最迟在Page_Load
中完成(最好是: Page_Init
)。 因此,您需要将添加的控件存储在某个地方,以便能够重新创建它们。 也许将控制计数存储在ViewState
就足够了。
因此,我应该将添加的控件存储在ViewState对象中,然后将它们重新添加到Page_Load的面板上?
不,您不应该将控件存储在ViewState
而应该存储重新创建控件所需的信息 。 您怎么知道您需要添加什么? 当然,您也可以使用Webdatabound控件,如Repeater
, DataList
或GridView
,您只需要分配一个DataSource
自动完成持久化工作。
即使您声明性地(在aspx上)添加所有控件,也是如此。 但是这些控件是由ASP.NET自动重新创建的。 由于客户端和服务器之间的通信是无状态且已断开连接,因此所有变量都在页面生命周期的末尾进行处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.