通过编程创建的ASP.NET文本框在回发后保留文本值,即使控件已清除

通过编程创建的ASP.NET文本框在回发后保留文本值,即使控件已清除,asp.net,vb.net,controls,textbox,postback,Asp.net,Vb.net,Controls,Textbox,Postback,我有一个下拉菜单,根据选择的项目,我调用一个web服务,然后动态创建一些文本框 我第一次下拉菜单并选择一个项目时,它工作得非常好,文本框是动态创建和填充的。但是,下次我在第一次回发后下拉菜单,选择不同的内容时。。。第二次回发后,原始值仍保留在文本框中 我正在清除占位符中的所有文本框,然后重新创建它们,然后设置一个新值,它们如何保留旧值。。。特别是如果我控制了。从页面上清除它们 注意:第二次创建文本框时,文本框ID最终是相同的。这可能与此有关吗?需要支持此重复ID功能 我的代码,从Page_Loa

我有一个下拉菜单,根据选择的项目,我调用一个web服务,然后动态创建一些文本框

我第一次下拉菜单并选择一个项目时,它工作得非常好,文本框是动态创建和填充的。但是,下次我在第一次回发后下拉菜单,选择不同的内容时。。。第二次回发后,原始值仍保留在文本框中

我正在清除占位符中的所有文本框,然后重新创建它们,然后设置一个新值,它们如何保留旧值。。。特别是如果我控制了。从页面上清除它们

注意:第二次创建文本框时,文本框ID最终是相同的。这可能与此有关吗?需要支持此重复ID功能

我的代码,从Page_Load调用,如下所示:编辑以添加更多代码

Private Sub RefreshEntity()

        Dim XmlRecords As New XmlDocument
        Dim XmlRecordsNode As XmlNode
        Dim EntityType As String = EntityTypes.SelectedValue
        Dim Entity As String = RecordValue.Value
        Dim FieldName As String
        Dim FieldValue As String

        FieldPlaceHolder.Controls.Clear()

        If RecordList.SelectedValue <> "Select..." Then
            Try
                XmlRecordsNode = LoginInfo.SharePointConnectWebService.GetMetaData(LoginInfo.WSUser, LoginInfo.WSPass, _
                                                                                  EntityType, Entity)
                XmlRecords.LoadXml(XmlRecordsNode.OuterXml)
            Catch ex As Exception
                ConfirmLabel.Text = "<b>Error:</b><br>" & ex.Message.ToString
                Return
            End Try
        Else
            SetProperties.Visible = False
            Return
        End If

        For Each OneNode As XmlNode In XmlRecords.SelectNodes("Fields").Item(0).ChildNodes

            FieldName = OneNode.Name
            FieldValue = OneNode.InnerText

            Dim newLabel As Label = New Label()
            newLabel.Text = FieldName & ":   "

            Dim newTextBox As TextBox = New TextBox()
            newTextBox.ID = "Field-" & FieldName
            newTextBox.Text = FieldValue

            Dim newLine As Label = New Label()
            newLine.Text = "<br><br>"

            FieldPlaceHolder.Controls.Add(newLabel)
            FieldPlaceHolder.Controls.Add(newTextBox)
            FieldPlaceHolder.Controls.Add(newLine)

        Next

        SetProperties.Visible = True

    End Sub

其中RecordList是我的下拉菜单。

您没有将该值存储在会话变量中,然后将其放回代码中的文本框中?

这可能是因为ViewState或发布的值与您的值冲突

一旦控件被动态添加到控件集合中,它就需要跟踪已经触发的所有页面生命周期事件。在回发的情况下,这意味着ViewState和/或posted表单值将根据您将动态控件添加到控件集合并设置.text属性的顺序,在文本框上关闭.text属性

要解决此问题,可以通过在“动态生成控件”中将属性设置为false来禁用ViewState。在设置控件的任何属性之前,还可以将控件添加到控件集合

For Each OneNode As XmlNode In XmlRecords.SelectNodes("Fields").Item(0).ChildNodes

    FieldName = OneNode.Name
    FieldValue = OneNode.InnerText

    Dim newLabel As Label = New Label()
    Dim newTextBox As TextBox = New TextBox()
    Dim newLine As Label = New Label()

    newTextBox.ID = "Field-" & FieldName

    newLabel.EnableViewState = False
    newTextBox.EnableViewState = False
    newLine.EnableViewState = False

    FieldPlaceHolder.Controls.Add(newLabel)
    FieldPlaceHolder.Controls.Add(newTextBox)
    FieldPlaceHolder.Controls.Add(newLine)

    newLabel.Text = FieldName & ":   "
    newTextBox.Text = FieldValue
    newLine.Text = "<br><br>"

Next

如果将此代码移动到Page_Init事件,是否会发生相同的行为?我看不出这在何处取决于下拉列表中的所选项目,因此我看不出为什么根据所选项目会有任何不同。。。“我遗漏了什么?”极客如果我把它放在Page_Init中,控件永远不会显示up@David我添加了代码,显示返回的XML如何依赖于下拉菜单中的内容。不,我没有将值存储在会话变量中。我将下拉菜单的值存储在隐藏字段中,由于该下拉列表在页面加载时也会根据其他内容动态填充。Aaron,我以前曾尝试将EnableViewState设置为false,但我没有尝试切换顺序。不幸的是,上面的代码产生了相同的结果。文本框获得相同的ID可以吗?一定有什么我遗漏了…这几乎就像回发前的文本框被重新添加到FieldPlaceHolder,并且.Text更新没有粘住…我还尝试禁用FieldPlaceHolder的viewstate。。。运气不好。请尝试从prerender而不是onload调用此函数。
For Each OneNode As XmlNode In XmlRecords.SelectNodes("Fields").Item(0).ChildNodes

    FieldName = OneNode.Name
    FieldValue = OneNode.InnerText

    Dim newLabel As Label = New Label()
    Dim newTextBox As TextBox = New TextBox()
    Dim newLine As Label = New Label()

    newTextBox.ID = "Field-" & FieldName

    newLabel.EnableViewState = False
    newTextBox.EnableViewState = False
    newLine.EnableViewState = False

    FieldPlaceHolder.Controls.Add(newLabel)
    FieldPlaceHolder.Controls.Add(newTextBox)
    FieldPlaceHolder.Controls.Add(newLine)

    newLabel.Text = FieldName & ":   "
    newTextBox.Text = FieldValue
    newLine.Text = "<br><br>"

Next