我有一个包含数据网格的界面。当我向数据网格添加元素时,我也将它添加到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
并在用户点击保存,我将列表中的所有元素保存到数据库。
如何在不使用会话的情况下保存列表元素。 (我的老板说在会话性能原因中存储元素列表并不好)
答案 0 :(得分:1)
您可以使用ViewState来存储listeSpecialite
。只需确保了解它是如何工作的,以确保符合您的需要。
Viewstate有其自身的缺点。序列化/反序列化的更多处理时间,B64中的编码/解码以及页面的加载/恢复视图状态中的页面生命周期等。此外,默认情况下,viewstate在隐藏字段中发送到客户端。这增加了带宽。
无论如何,如果您的列表不能保留在当前视图之外,我会使用Viewstate
。
编辑:
随着1000个项目的列表,viewstate将成为障碍。如何从数据库中读取持久化项目并在视图状态中保留添加的项目?您可以检索数据库项,从viewstate检索项,组合并绑定到datagrid。另一种策略是避免会话并以每次回发的读取数据库为代价来阻止viewstate。
正如我所说,没有银弹...... :-P