首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >asp.net面板在回发时丢失viewstate

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

Stack Overflow用户
提问于 2015-01-26 13:08:37
回答 1查看 1.4K关注 0票数 0

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

代码语言:javascript
复制
<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添加到该面板中,所以我这样做:

代码语言:javascript
复制
FilesControl files = (FilesControl)LoadControl("~/UserControls/FilesControl.ascx");
files.ID = XXX;
pnlFiles.Controls.Add(files); 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-26 14:01:29

应要求,我的意见作为答复:

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

ID是唯一的,我生成它。我在复选框中添加控件,选中了change事件chkCompare_CheckedChanged。

虽然在事件中动态添加控件是非常好的,但是在随后的回发中必须使用re-create这个控件。这必须最迟在Page_Load中完成(更好的是:Page_Init)。因此,您需要存储您已经添加的控件的某个位置,以便能够重新创建它们。也许将控件计数存储在ViewState中就足够了。

因此,我应该将添加到ViewState对象中的控件存储起来,然后将它们重新添加到Page_Load上的面板中?

不,您不应该将控件存储在ViewState中,而应该存储重新创建它们所需的信息。你怎么知道你需要加什么?当然,您也可以使用for数据库控件,如RepeaterDataListGridView,您只需要分配一个DataSource,持久化操作就会自动为您完成。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28150690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档