【问题标题】:Programatically created ASP.NET TextBox retains Text value after PostBack even if Control is cleared以编程方式创建的 ASP.NET TextBox 在 PostBack 后保留 Text 值,即使 Control 已清除
【发布时间】:2011-06-12 20:45:27
【问题描述】:

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

我第一次下拉菜单并选择一个项目时,它运行良好,并且文本框是动态创建和填充的。但是,下次我下拉菜单时(在第一次回发之后),并选择不同的东西......在第二次回发之后,原始值仍保留在文本框中。

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

注意:第二次创建它们时,文本框 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

RecordValue.Value 是在每个 Page_Load 中填充的隐藏字段:

                RecordValue.Value = RecordList.SelectedValue

RecordList 是我的下拉菜单。

【问题讨论】:

  • 如果将此代码移至 Page_Init 事件,是否会发生相同的行为?
  • 我看不出这取决于下拉列表中的所选项目,所以我不明白为什么这会根据所选项目而有所不同...什么是我失踪了?
  • @TheGeek 如果我把它放在 Page_Init 中,控件永远不会出现
  • @David 我添加了代码,显示返回的 XML 如何依赖于下拉菜单中的内容

标签: asp.net vb.net controls textbox postback


【解决方案1】:

这可能是由于 ViewState 或 Posted 值破坏了您的值。

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

要解决此问题,您可以通过在动态生成控件上将 .EnableViewState 属性设置为 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

【讨论】:

  • Aaron,我之前曾尝试将 EnableViewState 设置为 false,但是我没有尝试切换排序。不幸的是,上面的代码产生了相同的结果。文本框获得相同的 ID 可以吗?一定有我想念的东西......
  • 就好像回发前 TextBox 被重新添加到 FieldPlaceHolder 并且 .Text 更新没有坚持......
  • 我也尝试过禁用 FieldPlaceHolder 的视图状态......不走运。
  • 尝试从 prerender 而不是 onload 调用这个函数。
【解决方案2】:

您没有将值存储在 Session 变量中,然后稍后在代码中将其放回文本框中?

【讨论】:

  • 不,我没有将值存储在会话变量中。
  • 我将下拉列表的值存储在隐藏字段中,因为下拉列表也会在页面加载时根据其他内容动态填充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 2011-01-03
  • 2011-06-15
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多