我的ASP.Net页面上有一个ajax工具包选项卡容器,我在后面的代码中动态创建选项卡(在运行时,我有一个可变数量的选项卡,每个选项卡具有相同的布局但不同的头文本和身体数据)。每个选项卡只包含一个控件,它是我为使所有选项卡看起来相同而构建的用户控件。在用户控件中是我构建的另一个用户控件,用于处理选项卡中我的数据的分页。该分页用户控件具有一个支持其ViewState的属性。
我在ASPX页面上的单个BindData函数中绑定选项卡的所有数据。在该函数中,我总是为动态创建的控件设置一个ID,并在设置任何其他属性,连接事件或将数据绑定到它们之前将它们添加到容器控件中。
在这种情况下,我在分页用户控件中丢失了ViewState变量的值:
主ASPX页面
Page_Init:
If IsPostBack Then
BindData ' Recreates the control tree on postback.
' ViewState is loaded successfully here.
End If
Page_Load:
If Not IsPostBack Then
BindData() ' Bind the initial data.
End If
[Some event that happens after Page_Load in response to clicking on my user control]:
...
BindData() ' Controls recreated with changed data but same IDs as in Page_Init.
' ViewState does not get loaded back into my control tree.
我不应该期望在页面生命周期中我的控制树的第二个版本再次加载ViewState吗?
答案 0 :(得分:2)
经过多次阅读后,似乎在Init阶段之后创建的任何动态控件都不会加载ViewState。对于我的情况,在我的BindData函数中,我将viewstate值获取到局部变量,重新创建控件,然后重置viewstate值。这似乎有效。
答案 1 :(得分:0)
您应该在pre-init阶段创建动态控件。甚至在回发后重新创建它们。在此处查看页面生命周期的详细信息:http://msdn.microsoft.com/en-us/library/ms178472.aspx