在PostBack上保留动态UserControl

时间:2012-02-05 14:19:26

标签: asp.net vb.net user-controls postback viewstate

我正在动态地将用户控件加载到div中,我需要在回发时保留该div,以便在用户完成编辑后调用Save方法。 div和所有用户控件都有EnableViewState = True

ASPX Div宣言

<div id="dynamicDiv" runat="server" enableviewstate="true">
</div>

代码背后

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If (Not IsPostBack) Then
        'Implement some logic to load the User Controls using LoadControl
        'Set all the userControl properties (including EnableViewState = True)
        'Call a method in the user control to load it's content

        Me.dynamicDiv.Controls.add(userControl)
    End If
End Sub

Protected Sub Save(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
    For Each t As userControlType In Me.dynamicDiv.Controls
        t.Save()
    Next
End Sub

所以......控件加载很好,但是我找不到在回发时保留它们的方法,我无法重新加载它们,因为用户已经将数据输入到usercontrol中(这是我需要保存的)。

P.S。我尝试将它们添加到列表中,然后将列表添加到ViewState,但我无法正确序列化控件。我为userControl的代码实现了ISerializable,但随后它说ASCX被标记为可序列化的

Type 'ASP.controls_userControlType_ascx' in Assembly 'App_Web_pn5vxhpw, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

2 个答案:

答案 0 :(得分:4)

动态控件需要在页面初始化而不是页面加载时添加。然后他们将被viewstate接收。他们每次都需要创造。创建动态控件时不需要Ispostback。

答案 1 :(得分:2)

从评论中复制:

如果IsPostback,还需要重新创建UserControl。

您只需要分配与以前相同的ID,并最迟在Page_Load中添加。如果您知道要创建的控件数(可以存储在ViewState中),则可以通过将其附加到control-id来从计数器变量中派生ID。