2012-06-25 20 views
1

我創建了一個從標準WebControls.TextBox派生的ASP.NET類,目的是添加額外的屬性,這些屬性將在後備之間保留。但是,我無法確定如何讓這些屬性中的值持續存在。在ASP.NET派生控件中存儲和恢復屬性

我已經試過屬性的值設置到控制ViewStatePreRender處理程序的一部分,但價值則沒有對後回的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的答案是正確的,因爲在我原來的問題中,這是絕對正確的)。

回答

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 
+0

對不起,我不能得到這個工作 - 我仍然有ViewState中不以父頁/用戶控件要求的信息點初始化的問題(因爲它的一部分的'Load'處理) – freefaller

+0

@freefaller不要使用_myParam,我不明白你爲什麼要在** init **中檢索ViewState,並在** prerender **處理程序中進行賦值。 – adatapost

+0

因爲我試圖讓它工作。不幸的是,我仍然遇到同樣的問題,不管我如何使用你的代碼。如果控件託管在一個頁面上,並且該頁面檢索ctrl.MyParam作爲頁面'Load'處理程序的一部分,則該值仍然爲空......因爲我相信派生控件的'ViewState'仍然沒有初始化(至少它總是顯示爲「Nothing」,據我所知) – freefaller