2009-12-29 38 views
1

我正在构建一个大型的多区域MVC项目。 (MVC 2 Beta)。当IList的本地副本发生更改时,会话中存储的IList会更新

我有一个会议包装类,在自己的项目,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 

这工作正常。我后来检索会话列表到一个局部变量,用户名单:

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

我然后添加一个新的项目到本地用户列表(并会询问用户是否要保存它):

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

这是问题发生的地方。紧接在上面的.Add方法之后,本地userList添加了新项目, 但是存储在会话ALS​​O中的userList包含添加到本地列表的新项目。

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

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

谢谢,这让我疯狂!

+0

彼时不必实际列表项从会话列表复制到一个新的列表。现在一切正常。因为他首先指出了我所遇到的基本问题,因此给了詹姆斯一个回答。感谢James和Oded! – 2009-12-29 21:46:34

回答

1

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

var newList = new List(oldList); 
+0

感谢您的回复。 VB语法就是我所需要的。 – 2009-12-29 21:06:13

1

这是因为两个变量引用相同的列表。

所以,当通过一个变量添加时,您正在添加到相同的列表。

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

您可以轻松地复制列表中这样说:

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

谢谢,但是新的列表(MySession.UserList)将不起作用。它想要一个类型参数List(Of ...)。任何其他想法? – 2009-12-29 21:05:13

相关问题