2009-12-29 4 views
1

Je construis un grand projet MVC multi-zone. (MVC 2 Bêta).IList stocké dans la session est mis à jour lorsque la copie locale de l'IList est modifiée

J'ai une classe wrapper de session, dans son propre projet, MaSession, qui ressemble à ceci:

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 

Dans un projet de zone d'enfants, je construis et enregistrer une liste de session à travers mon emballage:

Dim favoritesList = (From m In db.getFavorites(UserId) Select m).ToList 
MySession.UserList = favoritesList 

Cela fonctionne très bien. Je récupérer plus tard la liste de la session dans une variable locale, userList:

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

Je puis ajouter un nouvel élément à la liste des utilisateurs locaux (et demandera à l'utilisateur si elles veulent enregistrer):

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

Voici où le problème se produit. Immédiatement après la méthode .Add ci-dessus, le userList local a ajouté le nouvel élément, MAIS la userList stockée dans la session contient également le nouvel élément qui a été ajouté à la liste locale.

Je ne veux pas que la liste soit mise à jour en session à moins que l'utilisateur ne souhaite enregistrer la nouvelle liste, et je l'enregistre explicitement.

Pourquoi cela se produit-il et comment puis-je ajouter uniquement l'élément à la liste locale, pas à celle en cours de session?

Merci, cela me rend fou!

+0

Blessez avoir à copier physiquement la liste des éléments de la liste de session à une nouvelle liste. Tout fonctionne bien maintenant. A donné le crédit pour la réponse à James parce qu'il était le premier à signaler le problème de base que j'avais. Merci James et Oded! –

Répondre

1

Ce que vous stockez dans la session est référence à une liste. C'est ce que vous mettez à jour lorsque vous mettez à jour la variable de session. Si vous voulez vraiment que ceux-ci soient déconnectés, vous devrez créer une copie de la liste lorsque vous la mettez dans la session ou en créer une copie lorsque vous la récupérerez. Je ne sais pas la syntaxe de VB, mais quelque chose comme (C#):

var newList = new List(oldList); 
+0

Merci pour votre réponse. La syntaxe VB est ce dont j'ai besoin. –

1

Cela se produit parce que les deux variables font référence à la même liste.

Ainsi, lorsque vous ajoutez via une variable, vous ajoutez à la même liste.

Vous devez copier la liste stockée dans MySession, opérer sur la copie et lorsque vous êtes prêt à enregistrer, définir MySession.UserList sur la copie.

Vous pouvez facilement copier la liste de cette façon:

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

Merci, mais la nouvelle liste (MySession.UserList) ne fonctionnera pas. Il veut un argument de type List (Of ...). D'autres idées? –

Questions connexes