2014-01-31 67 views
0

我有一個包含數據網格的接口。當我將元素添加到數據網格時,我將它添加到作爲我的數據網格的數據源的List屬性中。在這裏我的代碼隱藏列表的聲明:如何避免使用會話

Public Property listeSpecialite() As List(Of RECSPECIALITECONCOURS) 
    Get 
     Return Session("specialite") 
    End Get 
    Set(ByVal value As List(Of RECSPECIALITECONCOURS)) 
     Session("specialite") = value 
    End Set 
End Property 

,這裏是當我添加元素數據網格代碼:

Protected Sub gridsecialite_ItemCommand(source As Object, e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles gridsecialite.ItemCommand 
    If e.CommandName = "Insert" Then 
     Dim dropSpecialite As DropDownList = CType(e.Item.FindControl("txtSpecialite_Footer"), DropDownList) 

     Dim specialite As New RECSPECIALITECONCOURS 
     specialite.CODESPECIALITE = IGS.ChercherParIdInt(Of GENSPECIALITE)(CInt(dropSpecialite.SelectedValue)) 
     listeSpecialite.Add(specialite) 
     gridsecialite.DataSource = listeSpecialite    
     gridsecialite.DataBind()    

    End If 
End Sub 

,並在用戶點擊保存,我保存所有元素在我的列表中到數據庫。

如何在不使用會話的情況下保存列表的元素。 (我的老闆說在會話性能原因中存儲元素列表不好)

回答

1

您可以使用ViewState來存儲listeSpecialite。只要確保瞭解它是如何工作的,以確保您所需要的匹配。

Viewstate有它自己的缺點。序列化/反序列化,B64中的編碼/解除鎖定以及頁面的加載/恢復視圖狀態中的頁面生命週期等更多的處理時間。另外,默認情況下,viewstate以隱藏字段的形式發送到客戶端。這增加了帶寬。

無論如何,如果您的列表不能保持當前視圖,我會使用Viewstate

編輯:

隨着1000個項目列表viewstate將是艱難的。如何從數據庫讀取持久性項目並保持視圖狀態只是添加項目?您可以檢索數據庫項目,從視圖狀態檢索項目,組合並綁定到數據網格。這是避免會話和視圖狀態的另一種策略,其代價是在每次回發數據庫時讀取數據庫。

正如我所說的,有沒有銀彈... :-P

+0

是jlvaquero先生,這是一個替代了,但是你注意,有對性能產生影響,當我們處理數據的雙向名單(列表中超過1000個元素),因爲我認爲服務器和客戶端在回發上交換元素? – ucef

+1

是的。我對此很清楚。在我自己的文章中,我寫道:「另外,默認情況下,viewstate以隱藏字段發送到客戶端,這增加了帶寬。」您可以嘗試在服務器中使用gzip http響應以最小化帶寬,也可以將viewstate存儲在服務器端。關鍵是沒有銀彈。選擇一種方法並處理缺點以最小化它們。 – jlvaquero

+0

忘了說,客戶也可以gzip發佈請求... – jlvaquero