当IList的本地副本更改时,存储在Session中的IList会更新

时间:2009-12-29 20:08:42

标签: asp.net-mvc session ilist

我正在建设一个大型的多区域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包含添加到本地列表的新项目。

我不希望列表在会话中更新,除非用户想要保存新列表,我明确保存它。

为什么会发生这种情况,我如何只将项目添加到本地列表,而不是当前正在进行会话的列表?

谢谢,这让我疯了!

2 个答案:

答案 0 :(得分:1)

您在会话中存储的内容是列表的引用。这是更新会话变量时更新的内容。如果您确实希望这些链接未连接,则必须在将其放入会话时创建列表的副本,或者在检索时创建副本。我不知道VB语法,但有点像(C#):

 var newList = new List(oldList);

答案 1 :(得分:1)

这种情况正在发生,因为两个变量都引用了相同的列表。

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

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

您可以通过这种方式轻松复制列表:

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