我创建了一个从标准派生的 ASP.NET 类WebControls.TextBox
,目的是添加将在回发之间持续存在的额外属性。但是,我不知道如何让这些属性中的值保持不变。
我已经尝试将属性的值作为处理程序ViewState
的一部分设置到控件中PreRender
,但是在回发的处理程序中无法访问该值Init
,因为ViewState
尚未设置。
我可以在控件的处理程序中查找该ViewState
值Load
,但如果使用该控件的页面/用户控件在其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 在上一个问题中发现的那样,您最终可能会遇到先有鸡还是先有蛋的情况,您需要Init
在Load
.
(我仍然使 AVD 的答案正确,因为在我原来的问题的上下文中,它是绝对正确的)。