控制項學習二(保留Postback之後的值)
三.保留Postback之後的值
HTML不會保留控制項的值
1. 利用什麽機制保留?Session?還是ViewState?
當我們使用ViewState保存Text的值,當再次輸入內容,點Button后,TextBox的值是以前ViewSate而不是剛才輸入的值???
Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)
Dim renderData As String
renderData = "<input name='" & Me.ClientID & "' type=TextBox value='" & Me.Text & "'>"
output.Write(renderData)
End Sub
Private Sub MyTextBox_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Me.Page.IsPostBack = True Then Me.Text = Me.Page.Request.Form(Me.ClientID)
End Sub
End Class
注意,上面黑體字。這段程式碼使得控制項在postback的時候,透過request.from機制,取得表單山TextBox中的值,並且寫入屬性Text中,如此一來,徹底解決了所有的問題。
無法保留ViewState中的資訊
有時我們把物件保存到ViewState中,需要序列化。例如:
<Bindable(True), Category("Appearance"), DefaultValue("")> Property conn() As SqlClient.SqlConnection
Get
Return Me.ViewState("conn") '回傳屬性
End Get
Set(ByVal Value As SqlClient.SqlConnection)
Me.ViewState ("conn") = Value '設定屬性
End Set
End Property
上面,檔程式執行到Me.ViewState ("conn") = Value會報錯。
我們可以使用Session解決這一問題。
<Bindable(True), Category("Appearance"), DefaultValue("")> Property conn() As SqlClient.SqlConnection
Get
Return Me.Page.Session(Me.UniqueID & "_conn") '回傳屬性
End Get
Set(ByVal Value As SqlClient.SqlConnection)
Me.Page.Session(Me.UniqueID & "_conn") = Value '設定屬性
End Set
End Property
有沒有發現使用Session和使用ViewState存儲物件的時候,程式寫法有點不同,我們比較一下:
Me.Page.Session(Me.UniqueID & "_conn") = Value ß這是使用 Session
Me.ViewState ("conn") = Value ß這是 ViewState
差別在,使用ViewState的時候,沒有加上Page,而是直接使用,上面的“Me”關鍵字,應為寫在控制項Class裡面,所以代表是控制項的本身,因此,Me.ViewState表示的是“控制項自己的Viewstate”,而Me.Page.Session則是,“控制所屬網頁的Session物件”。
因此,ViewState不會有同名稱的問題,因為即使在一張網頁上,有多個該控制項的instance,每一個instance都有各自的ViewState,但是,由於Sessin物件是共用的,所以會有名稱重複的問題,因此,我們在Session物件的使用上,特別用[me.UniqueID&”_conn”]這個名稱取代【conn】,以避免當網頁上同時有多個該控制項的instance衝突,導致不同的控制項存取到同樣的Session變數,使得不同的控制項instance,屬性值變成一樣。