用屬性封裝 Session 及 ViewState 的存取

用屬性封裝 Session 及 ViewState 的存取

在 ASP.NET 程式中常會 Session 及 VIewState 儲存狀態,一般的寫法都是直接存取 Session 或 ViewState,例如將變數值儲存於 Session 的寫法如下。

 

  1. '將變數值儲存於 Session 中。  
  2. Dim oValue As New NameValueCollection  
  3. Session(KEY_SESSION) = oValue  
  4.  
  5. '由 Session 中轉型取得變數值。  
  6. Dim oValue As NameValueCollection  
  7. oValue = CType(Session(KEY_SESSION), NameValueCollection) 

        '將變數值儲存於 Session 中。
        Dim oValue As New NameValueCollection
        Session(KEY_SESSION) = oValue

        '由 Session 中轉型取得變數值。
        Dim oValue As NameValueCollection
        oValue = CType(Session(KEY_SESSION), NameValueCollection)

 

不過上述的寫法有一些缺點:

1.每次存取 Session 時都要做型別轉換的動作,執行效能不佳。

2.容易因為 Session 鍵值錯誤,而造成不可預期的問題。

3.程式維護上較困難。例如改變鍵值或 Session 改儲存於 ViewState 中。

 

所以比較好的作法,就是使用屬性來封裝 Session 或 VIewState 的存取。以下的範例中,使用 SessionCollection 屬性來封裝 Session 的存取,ViewStateCollection 屬性來封裝 ViewState 的存取。

  1. Private KEY_SESSION = "_SeesionCollection" 
  2. Private KEY_VIEWSTATE = "_ViewStateCollection" 
  3. Private FSessionCollection As NameValueCollection  
  4. Private FViewStateCollection As NameValueCollection  
  5.  
  6. ''' <summary>  
  7. ''' 封裝 Session 存取的屬性。  
  8. ''' </summary>  
  9. Private ReadOnly Property SeesionCollection() As NameValueCollection  
  10.     Get 
  11.         '若區域變數為 Nothing 才重新取得,防止重覆做型別轉換的動作  
  12.         If FSessionCollection Is Nothing Then 
  13.             If Session(KEY_SESSION) Is Nothing Then 
  14.                 FSessionCollection = New NameValueCollection()  
  15.                 Session(KEY_SESSION) = FSessionCollection  
  16.             Else 
  17.                 FSessionCollection = CType(Session(KEY_SESSION), NameValueCollection)  
  18.             End If 
  19.         End If 
  20.         Return FSessionCollection  
  21.     End Get 
  22. End Property 
  23.  
  24. ''' <summary>  
  25. ''' 封裝 ViewState 存取的屬性。  
  26. ''' </summary>  
  27. ''' <value></value>  
  28. Private ReadOnly Property ViewStateCollection() As NameValueCollection  
  29.     Get 
  30.         '若區域變數為 Nothing 才重新取得,防止重覆做型別轉換的動作  
  31.         If FViewStateCollection Is Nothing Then 
  32.             If ViewState(KEY_VIEWSTATE) Is Nothing Then 
  33.                 FViewStateCollection = New NameValueCollection()  
  34.                 ViewState(KEY_VIEWSTATE) = FSessionCollection  
  35.             Else 
  36.                 FViewStateCollection = CType(ViewState(KEY_VIEWSTATE), NameValueCollection)  
  37.             End If 
  38.         End If 
  39.         Return FViewStateCollection  
  40.     End Get 
  41. End Property 

    Private KEY_SESSION = "_SeesionCollection"
    Private KEY_VIEWSTATE = "_ViewStateCollection"
    Private FSessionCollection As NameValueCollection
    Private FViewStateCollection As NameValueCollection

    ''' <summary>
    ''' 封裝 Session 存取的屬性。
    ''' </summary>
    Private ReadOnly Property SeesionCollection() As NameValueCollection
        Get
            '若區域變數為 Nothing 才重新取得,防止重覆做型別轉換的動作
            If FSessionCollection Is Nothing Then
                If Session(KEY_SESSION) Is Nothing Then
                    FSessionCollection = New NameValueCollection()
                    Session(KEY_SESSION) = FSessionCollection
                Else
                    FSessionCollection = CType(Session(KEY_SESSION), NameValueCollection)
                End If
            End If
            Return FSessionCollection
        End Get
    End Property

    ''' <summary>
    ''' 封裝 ViewState 存取的屬性。
    ''' </summary>
    ''' <value></value>
    Private ReadOnly Property ViewStateCollection() As NameValueCollection
        Get
            '若區域變數為 Nothing 才重新取得,防止重覆做型別轉換的動作
            If FViewStateCollection Is Nothing Then
                If ViewState(KEY_VIEWSTATE) Is Nothing Then
                    FViewStateCollection = New NameValueCollection()
                    ViewState(KEY_VIEWSTATE) = FSessionCollection
                Else
                    FViewStateCollection = CType(ViewState(KEY_VIEWSTATE), NameValueCollection)
                End If
            End If
            Return FViewStateCollection
        End Get
    End Property

 

當要使用封裝 Session 及 ViewState 時,就如同存取屬性一樣。

  1. Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click  
  2.     Dim iCount As Integer 
  3.  
  4.     iCount = Me.SeesionCollection.Count  
  5.     Me.SeesionCollection.Add(iCount.ToString, iCount.ToString)  
  6.  
  7.     iCount = Me.ViewStateCollection.Count  
  8.     Me.ViewStateCollection.Add(iCount.ToString, iCount.ToString)  
  9. End Sub 

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim iCount As Integer

        iCount = Me.SeesionCollection.Count
        Me.SeesionCollection.Add(iCount.ToString, iCount.ToString)

        iCount = Me.ViewStateCollection.Count
        Me.ViewStateCollection.Add(iCount.ToString, iCount.ToString)
    End Sub

 

利用屬性封裝 Session 或 ViewState 的存取時,有下列優點:

1.撰寫程式碼時不用去理會 Seesion 或 ViewState,直接使用屬性即可,簡化程式碼及易讀性。

2.只做一次的型別轉換,執行效能較佳。

3.程式維護性佳。當 Session 或 ViewState 的鍵值變更或儲存目的改變時(如 Session 改為 ViewState),只需修改該屬性即可。

 

以上的做法雖然以 Session 及 ViewState 做示範,當然也可以使用相同方式來封裝 Application 及 Cache 的存取,也可達到上述的優點。

ASP.NET 魔法學院