1

我创建了一个从标准派生的 ASP.NET 类WebControls.TextBox,目的是添加将在回发之间持续存在的额外属性。但是,我不知道如何让这些属性中的值保持不变。

我已经尝试将属性的值作为处理程序ViewState的一部分设置到控件中PreRender,但是在回发的处理程序中无法访问该值Init,因为ViewState尚未设置。

可以在控件的处理程序中查找该ViewStateLoad,但如果使用该控件的页面/用户控件在其Load处理程序期间请求属性值,则该控件尚未到达它的Load处理程序,因此它不存在。

我现在的班级看起来像这样......

Public Class MyTextBox
    Inherits TextBox

    Private _myParam As String = ""
    Public Property MyParam As String
        Get
            Return _myParam
        End Get
        Set(value As String)
            _myParam = value
        End Set
    End Property

    Private Sub MyTextBox_Init(sender As Object, e As EventArgs) Handles Me.Init
        If Page.IsPostBack Then
            _myParam = ViewState("myParam")
        End If
    End Sub

    Private Sub MyTextBox_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
        ViewState("myParam") = _myParam
    End Sub
End Class

我一定遗漏了一些非常简单的东西,例如我是否可以针对该属性设置一个属性。

更新

感谢@AVD 指出我真的对 ViewState 和 Init / Load 阶段知之甚少,我终于弄清楚了。

如果您有时间(并且如果您正在做任何主要的 ASP.NET 工作,则需要抽出时间)请阅读@AVD 指向我的“了解 ASP.NET 视图状态”文档。它会解释很多。

但是,它没有解释的是,如果您将控件放在 a 内<asp:Repeater>,则不妨将所有规则扔出窗外……这正是我遇到的问题。

最后,我设法让它工作的方法是使用转发器中的控件,在转发器的处理程序中<asp:PlaceHolder>创建我的控件的实例ItemDataBound,然后将控件添加到<asp:PlaceHolder>... Init(幸运的是我能够做到)。

正如Andrew 在上一个问题中发现的那样,您最终可能会遇到先有鸡还是先有蛋的情况,您需要InitLoad.

(我仍然使 AVD 的答案正确,因为在我原来的问题的上下文中,它是绝对正确的)。

4

1 回答 1

1

您必须在属性访问器中向/从 ViewState 存储/检索值。

Public Property MyParam As String
    Get
       If IsNothing(ViewState("myParam")) Then
           return string.Empty
       End IF
       Return ViewState("myParam").ToString()
    End Get
    Set(value As String)
        ViewState("myParam") = value
    End Set
End Property
于 2012-06-25T13:03:37.980 回答