2014-01-31 66 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