2009-12-29 2 views
1

대규모의 다중 영역 MVC 프로젝트를 구축 중입니다. (MVC 2 베타).IList의 로컬 복사본이 변경되면 Session에 저장된 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 

잘 작동합니다. 나중에 로컬 변수에 세션의 목록을 검색, 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에는 로컬 목록에 추가 된 새 항목이 포함됩니다.

사용자가 새 목록을 저장하고 명시 적으로 저장하지 않는 한 목록에서 세션을 업데이트하지 않으려합니다.

왜 이런 일이 발생합니까? 현재 세션에있는 항목이 아닌 로컬 목록에만 항목을 추가하려면 어떻게해야합니까?

고마워요.

+0

는 물리적으로 새로운 목록에 세션 목록에서 목록 항목을 복사 할 필요까지 상처. 모든 작품은 이제 괜찮아. 제임스에 대한 답을 얻은 이유는 그가 처음으로 내가 가진 기본적인 문제를 지적했기 때문입니다. 감사합니다 제임스와 Oded! –

답변

1

세션에 저장하는 내용은 입니다. 참조 번호는입니다. 이것이 세션 변수를 업데이트 할 때 업데이트되는 내용입니다. 연결을 끊기를 원할 경우 세션에 넣거나 목록을 검색 할 때 사본을 만들 때 목록의 복사본을 만들어야합니다. VB 구문을 모르지만 (C#) :

var newList = new List(oldList); 
+0

답변 해 주셔서 감사합니다. VB 구문은 내가 필요한 것이다. –

1

두 변수가 같은 목록을 참조하기 때문에 이러한 현상이 발생합니다.

그래서 하나의 변수를 통해 추가 할 때 같은 목록에 추가됩니다.

MySession에 저장된 목록을 복사하고 복사본을 조작해야하며 저장할 준비가되면 MySession.UserList 사본을 복사해야합니다.

는 쉽게 목록을 이런 식으로 복사 할 수 있습니다 :

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

감사하지만 새 List (MySession.UserList)는 작동하지 않습니다. List (Of ...) 형식의 인수를 원합니다. 다른 아이디어? –

관련 문제