1

我正在构建一个大型的多区域 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

这工作正常。我稍后将会话中的列表检索到局部变量 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 中的 userList 还包含添加到本地列表中的新项目。

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

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

谢谢,这让我发疯了!

4

2 回答 2

1

发生这种情况是因为两个变量都引用了同一个列表。

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

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

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

Dim copy As IList = new List(MySession.UserList)
于 2009-12-29T20:17:08.017 回答
1

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

 var newList = new List(oldList);
于 2009-12-29T20:13:51.327 回答