2014-04-27 5 views
0

일부 임시 목록 데이터를 저장하려고하므로 사용자가 데이터베이스에 저장하기 전에 편집 할 수 있도록합니다.List 개체를 뷰 상태에 저장할 수 없습니다.

public List<ScheduleEntry> NewScheduleEntry 
{ 
    get 
    { 
     String PersistentName = "List_ScheduleEntry"; 
     if (ViewState[PersistentName] == null || !(ViewState[PersistentName] is List<ScheduleEntry>)) 
     { 
      ViewState[PersistentName] = new List<ScheduleEntry>(); 
     } 
     return ViewState[PersistentName] as List<ScheduleEntry>; 
    } 
} 

public List<ScheduleEntry> ListView_CourseScheduleEntry_GetData() 
{ 
    return NewScheduleEntry; 
} 

이 기술을 처음 사용하는 것은 아니지만 작동하지 않습니다. 예외는 없으며 return 문까지 ListView_CourseScheduleEntry_GetData가 실행 된 것을 볼 수 있습니다.

그러나 ViewState를 세션 (다른 변경 없음)으로 변경하면 정상적으로 작동합니다. 불행히도 페이지 트랜잭션이므로 여기서는 세션을 사용하지 말아야합니다.

viewstate의 Base64 인코딩 문자열이 목록 데이터에 의해 손상되었을 가능성이 있습니까?

+2

'ScheduleEntry' 클래스가'Serializable'으로 표시되어 있습니까? 목록에 일부 항목을 추가합니까? – Markus

+0

@ Markus 당신 말이 맞아요. 사실 ScheduleEntry는 EF에서 왔고 모든 관련 클래스에 대해 [Serializable]을 표시해야합니다 ..... – Yiping

답변

1

세션 메모리에 저장된 값과 달리 ViewState에 저장된 클래스는 어떤 경우에도 ViewState가 페이지에 직렬화되기 때문에 Serializable으로 표시되어야합니다 (세션 메모리가 서버에 보관되어있는 한 객체 직렬화없이 메모리에 저장 됨). 이 설명은 객체가 Session에 저장 될 때 작동하는 이유와 ViewState에 저장 될 때 작동하지 않는 이유를 설명합니다.

따라서 경우 ScheduleEntry 클래스에 Serializable 속성을 추가하고 모든 관련 클래스는 문제를 해결해야합니다

[Serializable] 
public class ScheduleEntry 
{ 
    // ... 
} 

ASP.NET의 ViewState에 대한 자세한 내용은이 link를 참조하십시오.

+0

모든 관련 클래스에 대해 [Serializable] – Yiping

관련 문제