2009-12-29 39 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

相關問題