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に新しいアイテムが追加されますが、セッションに格納されているuserListには、ローカルリストに追加された新しいアイテムも含まれます。

ユーザーが新しいリストを保存する必要がない限り、セッションでリストを更新したくないので、明示的に保存します。

これが発生するのはなぜですか。また、現在セッション中のアイテムではなく、ローカルリストにのみアイテムを追加するにはどうすればよいですか。

おかげで、これは私を狂わせています!

4

2 に答える 2

1

セッションに保存しているのは、リストへの参照です。これは、セッション変数を更新するときに更新するものです。これらを本当に接続解除したい場合は、リストをセッションに配置するときにリストのコピーを作成するか、リストを取得するときにコピーを作成する必要があります。VB構文はわかりませんが、(C#)のようなものです。

 var newList = new List(oldList);
于 2009-12-29T20:13:51.327 に答える
1

これは、両方の変数が同じリストを参照しているために発生しています。

したがって、1つの変数を介して追加する場合は、同じリストに追加することになります。

に保存されているリストをコピーMySessionし、コピーを操作して、コピーにセットを保存する準備ができたら、コピーする必要がありMySession.UserListます。

この方法でリストを簡単にコピーできます。

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