【问题标题】:My asp.net control loses its property values?我的 asp.net 控件丢失了它的属性值?
【发布时间】:2009-06-03 16:18:25
【问题描述】:

我正在为我的 asp.net 网站编写一个自定义用户控件,用于存储日期时间。它有两个属性:

    Private _includeTime As Boolean
    Private _value As DateTime = Nothing

    Public Property IncludeTime() As Boolean
        Get
            Return _includeTime
        End Get
        Set(ByVal value As Boolean)
            _includeTime = value
        End Set
    End Property

    Public Property SelectedDateTime() As DateTime
        Get
            Try
                _value = DateTime.Parse(txtDate.Text)
                If IncludeTime Then
                    _value.AddHours(Short.Parse(txtHour.Text))
                    _value.AddMinutes(Short.Parse(txtMinute.Text))
                    _value.AddSeconds(Short.Parse(txtSecond.Text))
                End If
            Catch ex As Exception
                _value = Nothing
            End Try
            Return _value
        End Get
        Set(ByVal value As DateTime)
            _value = value
        End Set
    End Property

我以这种方式调用我的自定义控件:

<my:DateTimeInput runat="server" includetime="true" ID="txtWhen" />

这会正确设置 includetime 属性。

在我的后端代码中,我也在 page_load 上执行此操作:

txtWhen.SelectedDateTime = now

当我逐步调试调试器时,我看到属性被设置,但是当控件本身的 page_load 加载时,属性值被重置为空!

控件的page_load:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    lbltime.Visible = IncludeTime

    If SelectedDateTime().CompareTo(Nothing) > 0 Then
        txtDate.Text = SelectedDateTime.Date.ToShortDateString()
        txtHour.Text = SelectedDateTime.Hour.ToString("D2")
        txtMinute.Text = SelectedDateTime.Minute.ToString("D2")
        txtSecond.Text = SelectedDateTime.Second.ToString("D2")
    End If

End Sub

你知道为什么这个属性会失去它的价值吗?

【问题讨论】:

    标签: asp.net vb.net controls


    【解决方案1】:

    控件的 Page_Load 方法使用 SelectedDateTime 属性而不是基础 _value 字段。

    SelectedDateTime 属性的 Get 方法从 txtDate(和 txtHour 等)的内容重建 _value。因此,无论您将 _value 设置为什么,SelectedDateTime 属性都会返回文本框中的内容,我认为这没什么,因为页面只是在加载。

    我建议你改变

    If SelectedDateTime().CompareTo(Nothing) > 0 Then
    

    If _value.CompareTo(Nothing) > 0 Then
    

    【讨论】:

      【解决方案2】:

      问题是“get”访问器将文本框内容写入_value 变量之上。


      还有:

      每次执行新的回发时,您都在使用该控件所在的页面类的新实例,因此是控件本身的新实例。

      如果您希望控件的值在回发中保持不变,则必须将它们放在可以在回发中保留的位置,例如会话或视图状态。

      【讨论】:

      • SelectedDateTime 属性的加载发生在页面的 page_load 中。所以它是页面 page_load -> control page_load,它仍然没有设置。之间没有回发,afaik,或者我错过了一些东西。
      猜你喜欢
      • 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
      相关资源
      最近更新 更多