【问题标题】:Problems reloading the viewstate of my dynamically created ASP.Net controls重新加载动态创建的 ASP.Net 控件的视图状态时出现问题
【发布时间】:2009-10-09 14:52:15
【问题描述】:

我的 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 在页面生命周期的第二个版本的控件树上再次加载吗?

【问题讨论】:

    标签: asp.net viewstate


    【解决方案1】:

    经过大量阅读,似乎在 Init 阶段之后创建的任何动态控件都不会加载 ViewState。对于我的情况,在我的 BindData 函数中,我将视图状态值获取到局部变量,重新创建控件,然后重置视图状态值。这似乎有效。

    【讨论】:

    • 您是否尝试过将控件创建代码插入到 pre-init 中?只是看看它是否可以节省您从视图状态手动重新分配值的工作。虽然你已经让它工作了:)
    • 问题出在 ASP.NET 中,一旦绑定一次,它就会忘记视图状态。这发生在初始化之后但加载之前。即使您重新创建完全相同的控制树,视图状态也不能在同一请求期间绑定两次。烦人,是的!
    【解决方案2】:

    您应该在预初始化阶段创建动态控件。甚至在回发之后重新创建它们。在此处查看页面生命周期的详细信息:http://msdn.microsoft.com/en-us/library/ms178472.aspx

    【讨论】:

    • 我确实在 Init 阶段重新创建了我的动态控件(我查看了这篇文章,并且 ViewState 加载是在 Init 之后进行的,因此在 PreInit 或 Init 中创建动态控件似乎并不重要) ,包括回发后。所有这些工作正常。当我在控件事件处理程序触发后再次创建控件时,我失去了我的 ViewState。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多