session - 更改了IList本地副本时,将更新会话中存储的IList

  显示原文与译文双语对照的内容

我正在构建一个大的,多领域的MVC项目。 ( MVC 2测试版) 。

我有一个会话包装类,在它自己的项目MySession中,看起来像这样:


Public Class MySession

Private Shared _userlist As String ="UserList"

Public Shared Property UserList() As IList
 Get
 If HttpContext.Current.Session(_userlist) Is Nothing Then
 Return Nothing
 Else
 Return CType(HttpContext.Current.Session(_userlist), IList)
 End If
 End Get
 Set(ByVal value As IList)
 HttpContext.Current.Session(_userlist) = value
 End Set
End Property

End Class

在子区域项目中,我通过包装器生成并保存一个列表到会话:


Dim favoritesList = (From m In db.getFavorites(UserId) Select m).ToList
MySession.UserList = favoritesList

这种情况很好。我以后从会话中将列表从会话中检索到一个局部变量,dbspace:


Dim userList As IList(Of getFavoritesResult)
userList = MySession.UserList

然后,我将一个新项目添加到本地 userList ( 并询问用户是否要保存它):


userList.Add(New getFavoritesResult With {.Id = addApp.AppId,. DisplayText = addApp.DisplayText,.. .})

这就是问题发生的地方。 在上面的. Add 方法之后,本地dbspace添加了新项,但存储在会话中的dbspace还包含新的项目。

除非用户希望保存新列表,否则不要在会话中更新列表,否则我将显式保存该列表。

为什么发生这种情况,以及如何仅将项目添加到本地列表中,而不是添加到会话中的当前列表中?

谢谢,这把我driving了 !

时间: 原作者:

你在会话中所存储的内容是一个英镑的引用 。 这就是更新会话变量时更新的内容。 如果你真的希望这些不连接,你将在会话中创建一个 List 副本或者在你检索它时创建副本。 我不知道VB语法,但类似于( C# ):


 var newList = new List(oldList);

这是因为两个变量都引用同一个列表。

因此,当通过一个变量添加时,你将添加到相同的列表中。

你需要复制存储在 MySession 中的列表,操作副本,并准备好将集 MySession.UserList 保存到复制中。

你可以通过以下方式轻松地复制列表:


Dim copy As IList = new List(MySession.UserList)

原作者:
...