如何避免使用Session

时间:2014-01-31 09:25:31

标签: asp.net vb.net session

我有一个包含数据网格的界面。当我向数据网格添加元素时,我也将它添加到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 个答案:

答案 0 :(得分:1)

您可以使用ViewState来存储listeSpecialite。只需确保了解它是如何工作的,以确保符合您的需要。

Viewstate有其自身的缺点。序列化/反序列化的更多处理时间,B64中的编码/解码以及页面的加载/恢复视图状态中的页面生命周期等。此外,默认情况下,viewstate在隐藏字段中发送到客户端。这增加了带宽。

无论如何,如果您的列表不能保留在当前视图之外,我会使用Viewstate

编辑:

随着1000个项目的列表,viewstate将成为障碍。如何从数据库中读取持久化项目并在视图状态中保留添加的项目?您可以检索数据库项,从viewstate检索项,组合并绑定到datagrid。另一种策略是避免会话并以每次回发的读取数据库为代价来阻止viewstate。

正如我所说,没有银弹...... :-P