从ViewState中丢失<asp:label>文本值以动态添加控件</asp:label>

时间:2012-03-05 12:45:30

标签: asp.net .net vb.net viewstate

我在后面的代码中以编程方式向页面添加控件。我添加一个asp:Label并设置它的Text值。我添加一个asp:TextBox并设置它的Text值。两个Text值都在Response中返回并显示在浏览器中。到目前为止一切都很好。

用户执行导致回发的操作。我重新加载动态添加的asp:Label和asp:TextBox。将Response返回给浏览器时,仅显示asp:TextBox Text值。 asp:Label Text值不是。

如果我检查HTML,我可以看到asp:Label控件(呈现为HTML span标签),但没有值。

如何让代码在每次回发时自动重新加载asp:Label的Text值?为什么asp:Label和asp:TextBox的行为不同?我不想在每次回发时手动重新设置Text值。

以下是一些类似于我正在做的代码(placeHolderNameplates是asp:aspx页面上的asp:PlaceHolder控件):

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    If Not Page.IsPostBack Then
        Dim lbl As Label = New Label()
        lbl.ID = "xxx1"
        lbl.Text = "yo"
        placeHolderNameplates.Controls.Add(lbl)

        Dim tb As TextBox = New TextBox
        tb.ID = "xxx2"
        tb.Text = "yoyo"
        placeHolderNameplates.Controls.Add(tb)

    Else
        Dim lbl As Label = New Label()
        lbl.ID = "xxx1"
        placeHolderNameplates.Controls.Add(lbl)

        Dim tb As TextBox = New TextBox
        tb.ID = "xxx2"
        placeHolderNameplates.Controls.Add(tb)

    End If

3 个答案:

答案 0 :(得分:4)

您需要做的是在设置值之前将控件添加到占位符,因此它应该是 Dim lbl As Label = New Label()
placeHolderNameplates.Controls.Add(lbl)
lbl.ID = "xxx1"
lbl.Text = "yo"

有关详细信息,请参阅这些帖子: http://www.yakkowarner.com/2008/01/aspnet-dynamic-controls-and-viewstate.html http://codebetter.com/jefferypalermo/2004/11/25/key-to-ensuring-dynamic-asp-net-controls-save-viewstate-level-300/

  

在将它们添加到页面之前,它们尚未初始化。当动态控件添加到另一个控件时,新控件会进行追赶以进入父控件所在的阶段。例如,如果在Page_Load中添加了一个文本框,它将会追赶并开始通过其Init和Load阶段。这很重要,因为它将开始跟踪其视图状态。在跟踪viewstate之前添加的值将不会使其成为viewstate并且将在PostBack上丢失。

答案 1 :(得分:0)

似乎动态创建的控件不会自动添加到ViewState。 TextBox控件保留了它的值,但是因为它被渲染到<input type="text" value="xyz" /> html元素的性质。

看一下这篇文章:

http://www.codeproject.com/Articles/3684/Retaining-State-for-Dynamically-Created-Controls-i

答案 2 :(得分:0)

嘿,请查看本网站MSDN

您必须使用以下事件添加控件(以便viewstate自动维护)

override protected void OnInit(EventArgs e)

添加动态控件的示例 http://support.microsoft.com/kb/317794/en-us