控制項學習二(保留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,屬性值變成一樣。

posted @ 2008-11-15 16:15  yellowwood  阅读(550)  评论(0编辑  收藏  举报
Never Give UP