C# asp.net面板在回发时丢失viewstate
我有一个网页,里面有一个更新面板。 在“更新”面板中,我有一个带有如下用户控件的面板:C# asp.net面板在回发时丢失viewstate,c#,asp.net,C#,Asp.net,我有一个网页,里面有一个更新面板。 在“更新”面板中,我有一个带有如下用户控件的面板: <asp:UpdatePanel ID="updatePanel" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional"> <ContentTemplate> <asp:Panel ID="pnlFiles" runat="server" EnableViewState="true">
<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 files = (FilesControl)LoadControl("~/UserControls/FilesControl.ascx");
files.ID = XXX;
pnlFiles.Controls.Add(files);
但在每次回发(选中每个复选框)时,面板将丢失最后一个状态,添加的控件将被删除,因此面板实际上每次都会返回其初始状态,我无法向其添加越来越多的控件。
我启用了视图状态,但没有帮助。
我在这里遗漏了什么?根据要求,我的评论作为答案: 您需要在
page\u Init
或page\u Load
(最迟)中的每次回发时使用与以前相同的ID将控件添加到页面
ID是唯一的,我生成它。我在复选框中添加控件 已检查更改事件chkCompare\u CheckedChanged
虽然可以在事件中动态添加控件,但有必要在后续回发中重新创建此控件。这必须最迟在
Page\u Load
中完成(最好是Page\u Init
)。因此,您需要将已添加的控件存储在某个位置,以便能够重新创建它们。也许将控件计数存储在ViewState
中就足够了
因此,我应该将添加的控件存储在ViewState对象中,然后
然后将它们重新添加到页面上的面板上
不,您不应该将控件存储在ViewState
中,而是存储重新创建控件所需的信息。您如何知道需要添加哪些内容?当然,您也可以使用webdatabound控件,如Repeater
、DataList
或GridView
,其中您只需要分配数据源
,并且会自动为您执行持久化操作
这就是对所有控件所做的,即使您以声明方式添加它们(在aspx上)。但是这些控件是由ASP.NET自动重新创建的。由于客户端和服务器之间的通信是无状态且断开连接的,因此所有变量都在页面的末尾处理。是否在
page\u Init
或page\u Load
中的每次回发中使用与以前相同的ID向页面添加控件?ID是唯一的,我生成它。我在复选框checked change eventchkCompare\u checked changed
上添加控件虽然可以在事件中动态添加控件,但有必要在后续回发中重新创建此控件。这必须最迟在Page\u Load
中完成(最好是Page\u Init
)。因此,您需要将已添加的控件存储在某个位置,以便能够重新创建它们。也许将控件计数存储在视图状态
中就足够了。但是面板是硬编码的,我向它添加了控件,所以它不一定有自己的视图状态,他将添加到其中的控件存储在其中吗?我可以尝试管理自己的视图状态,但如果面板已经有自己的视图状态,则似乎不正确。否?控件的viewstate不用于持久化动态控件。如果文本框
没有默认值,它只用于存储文本
属性的f.e