我正在建设一个大型的多区域MVC项目。 (MVC 2 Beta)。
我有一个会话包装器类,在它自己的项目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
在子区项目中,我通过我的包装器构建并保存List到Session:
Dim favoritesList = (From m In db.getFavorites(UserId) Select m).ToList
MySession.UserList = favoritesList
这很好用。我稍后将会话中的列表检索到局部变量userList:
Dim userList As IList(Of getFavoritesResult)
userList = MySession.UserList
然后我将一个新项添加到LOCAL userList(并询问用户是否要保存它):
userList.Add(New getFavoritesResult With {.Id = addApp.AppId, .DisplayText = addApp.DisplayText, ...})
以下是问题发生的地方。在上面的.Add方法之后,本地userList立即添加了新项, 但是存储在Session ALSO中的userList包含添加到本地列表的新项目。
我不希望列表在会话中更新,除非用户想要保存新列表,我明确保存它。
为什么会发生这种情况,我如何只将项目添加到本地列表,而不是当前正在进行会话的列表?
谢谢,这让我疯了!
答案 0 :(得分:1)
您在会话中存储的内容是列表的引用。这是更新会话变量时更新的内容。如果您确实希望这些链接未连接,则必须在将其放入会话时创建列表的副本,或者在检索时创建副本。我不知道VB语法,但有点像(C#):
var newList = new List(oldList);
答案 1 :(得分:1)
这种情况正在发生,因为两个变量都引用了相同的列表。
因此,当通过一个变量添加时,您将添加到同一个列表中。
您需要复制MySession
中存储的列表,对副本进行操作,并在准备好将集MySession.UserList
保存到副本时。
您可以通过这种方式轻松复制列表:
Dim copy As IList = new List(MySession.UserList)