我創建了一個從標準WebControls.TextBox
派生的ASP.NET類,目的是添加額外的屬性,這些屬性將在後備之間保留。但是,我無法確定如何讓這些屬性中的值持續存在。在ASP.NET派生控件中存儲和恢復屬性
我已經試過屬性的值設置到控制ViewState
爲PreRender
處理程序的一部分,但價值則沒有對後回的Init
處理程序訪問,因爲ViewState
至今尚未建立。
我能尋找在Load
處理器控制的ViewState
價值,但如果頁面/用戶控件正在使用控制其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
我必須失去了一些東西很簡單,比如是否有我可以設置對財產的屬性。
UPDATE
由於@AVD指出,我真的對ViewState的和初始化/加載階段很少的線索,我終於想通了這一切。
如果你有時間(如果你正在做任何主要的ASP.NET工作,你需要需要來做時間),請閱讀@AVD指向我的Understand ASP.NET View State文檔。它會解釋很多。
然而,它沒有解釋的是,如果你把你的控制在一個<asp:Repeater>
,你可能會拋出所有的規則窗外......這正是我遇到的問題。
最後,我設法得到它的工作方式是中繼器內使用<asp:PlaceHolder>
控制,創建ItemDataBound
處理中繼器的內我的控制的一個實例,然後添加控件到<asp:PlaceHolder>
。 ..所有在Init
部分完成(幸運的是我能夠做到)。
作爲Andrew found out in this previous question你可以最終在雞/雞蛋的情況下,你需要在Init
創建控件,但你不知道什麼控制你需要,直到Load
。
(我仍然使AVD的答案是正確的,因爲在我原來的問題中,這是絕對正確的)。
對不起,我不能得到這個工作 - 我仍然有ViewState中不以父頁/用戶控件要求的信息點初始化的問題(因爲它的一部分的'Load'處理) – freefaller
@freefaller不要使用_myParam,我不明白你爲什麼要在** init **中檢索ViewState,並在** prerender **處理程序中進行賦值。 – adatapost
因爲我試圖讓它工作。不幸的是,我仍然遇到同樣的問題,不管我如何使用你的代碼。如果控件託管在一個頁面上,並且該頁面檢索ctrl.MyParam作爲頁面'Load'處理程序的一部分,則該值仍然爲空......因爲我相信派生控件的'ViewState'仍然沒有初始化(至少它總是顯示爲「Nothing」,據我所知) – freefaller