在ASP.NET派生控件中存储和还原属性

时间:2012-06-25 12:51:48

标签: asp.net vb.net asp.net-2.0

我创建了一个派生自标准WebControls.TextBox的ASP.NET类,目的是添加在post-backs之间保留的额外属性。但是,我无法弄清楚如何使这些属性中的值保持不变。

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

可以在控件的ViewState处理程序中查找Load值,但是如果正在使用该控件的页面/ usercontrol请求属性值它的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指出的Understand ASP.NET View State文档至。它会解释很多。

然而,它没有解释的是,如果你将你的控件置于<asp:Repeater>之内,你可以将所有规则抛出窗外......这正是我遇到的问题。

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

作为Andrew found out in this previous question,您可能最终处于鸡/蛋状态​​,您需要在Init中创建控件,但在{{1}之前您不知道需要什么控件}}

(我仍然让AVD的回答正确,因为在我原来的问题的背景下,这是完全正确的。)

1 个答案:

答案 0 :(得分: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
相关问题