UserControl文本框不会维护状态

时间:2009-03-31 04:55:10

标签: asp.net user-controls state

我有一个非常简单的用户控件,基本上是一个文本框和一个标签,其目的是在彼此之间切换。控件在页面Page_Load event期间绑定。在UserControl的Page_Load事件中,我调用Toggle()函数,该函数显示或隐藏适当的控件,并分别根据布尔可编辑属性和字符串Text属性设置其文本。

这是我的Toggle()方法(记住Editable和Text是公共属性):

Public Sub Toggle()
    If Editable Then
        txtText.Visible = True
        lblText.Visible = False
        txtText.Text = Text
        txtText.CssClass = TextboxCSSClass
    Else
        txtText.Visible = False
        lblText.Visible = True
        lblText.Text = Text
        lblText.CssClass = LabelCSSClass
    End If
End Sub

我的问题也很简单:当页面上的按钮调用控件的Toggle()方法时,切换工作正常,但文本消失了!我试过这个旁边有一个普通的未绑定文本框,文本框保持其文本值就好了。有什么我想念的吗?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

当您将控件的visible属性设置为False时,它将不会在Html中呈现,因此它不能在页面之间传送状态。而是考虑使用MultiView控件

答案 1 :(得分:0)

更新:有关评论的更多信息。

如果禁用了视图状态,并设置了文本框的文本,则文本是输入控件中的文本。当您尝试了解给定文本框的值是否发生更改时,这会在不常见的情况下影响您。

以上标签不同,因为它不是输入控件。禁用视图状态后,如果未在每个请求上设置文本,它将显示初始值(试用​​)。视图状态是自动允许保持信息在回发中的控件。

正如标签所发生的那样,它发生在用户控件上。如果更改setter使其直接设置两个控件文本,则在使用viewstate时它将保留内部控件中的值。如果将其关闭,标签的行为将与文本框的行为不同。

另请注意,关闭视图状态也会影响Visible配置。我关闭了视图状态,但你可能有一个场景,你真的希望保持控制信息的回发。关闭视图状态时,您需要确保始终配置控件,而不仅仅是在!IsPostBack时。

请注意,如果您跟踪应该是Visible的内容以及代码中的文本,那么您可以关闭内部控件的viewstate(假设您没有为其分配任何其他属性)。


初步回答:

您正在将Text属性的当前值分配给标签/文本框。如果您没有在当前请求中设置该值,则它具有默认值,因此您将获得空文本。

您可以将视图状态中的值保存为(c#语法):

public string Text
{
   get
   {
      return (string) ViewState["MyText"];
   }
   set
   {
      ViewState["MyText"] = value;
   }
}

聚苯乙烯。这不是唯一的方法。如果切换没有设置文本,但是你在两个控件的setter上都做了,那么他们会保留这些值(只要在跟踪viewstate之后分配用户控件的Text属性,就像在页面Load中一样) )。

答案 2 :(得分:0)

我明白了!我为愚蠢而道歉。这就是我做错了:我对文本属性的Get / Set存储在私有成员中。这意味着当对文本进行更新时,它不知道,因为它没有连接到文本框。相反,我做了以下事情:

Public Property Text() As String
    Get
        Return txtText.Text
    End Get
    Set(ByVal value As String)
        txtText.Text = value
    End Set
End Property

并在我的Page_Load事件中:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        lblText.Text = Text
        Toggle()
    End If
End Sub

现在它工作正常!感谢那些让我走上正确道路的人! :)