2009-08-11 17 views

Odpowiedz

53

Tak, można przechowywać dowolny obiekt (zakładam używasz ASP.NET z ustawieniami domyślnymi, która jest w trakcie procesu stan sesji):

Session["test"] = myList; 

oddasz go z powrotem do pierwotnego typu dla używać:

var list = (List<int>)Session["test"]; 
// list.Add(something); 

Richard zwraca uwagę, należy zachować szczególną ostrożność w przypadku korzystania z innych trybów stanu sesji (np SQL Server), które wymagają obiektów do serializacji.

+5

Niezupełnie prawdziwe. Jeśli chcesz użyć innego magazynu sesji niż domyślny w proc, klasa będzie wymagała serializacji. Dlatego najlepiej zaznaczyć wszystkie zajęcia, które wprowadzasz w sesji jako Serializowalne od samego początku - wtedy możesz zmienić mechanizm bez konieczności edytowania kodu. – RichardOD

+0

Ważny punkt, ale 1. 'List ' jest możliwy do serializacji, jeśli 'T' jest możliwy do serializacji. 2. Domyślnym trybem stanu sesji jest in-proc. –

+0

@ Mehrdad- Dostaję to, co miałeś na myśli i dobrze, że masz próbkę kodu. Właśnie przeredagowałem "dowolny obiekt" w twojej odpowiedzi. – RichardOD

16

Tak. O której platformie piszesz? ASP.NET C#?

List<string> myList = new List<string>(); 
Session["var"] = myList; 

Następnie, aby pobrać:

myList = (List<string>)Session["var"]; 
4

znalazłem w pliku klasy poza zakresem strony, powyższy sposób (co zawsze używany) nie działa.
znalazłem obejście w tym „kontekście” w następujący sposób:

HttpContext.Current.Session.Add("currentUser", appUser); 

i

(AppUser) HttpContext.Current.Session["currentUser"] 

przeciwnym razie kompilator spodziewa się ciąg kiedy wskazał obiekt na obiekt sesji.

+0

Otrzymuję taki błąd: System.Web.HttpException: Nie można serializować stanu sesji. W trybie "StateServer" i "SQLServer" program ASP.NET serializuje obiekty stanu sesji, w wyniku czego obiekty nie podlegające serializacji lub obiekty MarshalByRef są niedozwolone. To samo ograniczenie ma zastosowanie, jeśli podobna serializacja jest wykonywana przez niestandardowy magazyn stanów sesji w trybie niestandardowym –

1

Spróbuj ..

List<Cat> cats = new List<Cat> 
    { 
     new Cat(){ Name = "Sylvester", Age=8 }, 
     new Cat(){ Name = "Whiskers", Age=2 }, 
     new Cat(){ Name = "Sasha", Age=14 } 
    }; 
    Session["data"] = cats; 
    foreach (Cat c in cats) 
     System.Diagnostics.Debug.WriteLine("Cats>>" + c.Name);  //DEBUGGG 
0
YourListType ListName = (List<YourListType>)Session["SessionName"];