簡體   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