我创建了一个派生自标准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的回答正确,因为在我原来的问题的背景下,这是完全正确的。)
答案 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