2013-07-05 4 views
6

Ho questo problema davvero strano e sono sicuro che mi manca qualcosa di ovvio qui. Ho queste due righe:L'oggetto della sessione cambia quando l'oggetto viene aggiornato in C#

HttpContext.Current.Session[listModelType + "ListModel"] = listModel; 
listModel.ProductRows = new Collection<ProductRow>(listModel.ProductRows.Where(r => r.ParentRowId == 0).ToList()); 

Dopo la seconda linea viene eseguito il mio oggetto della sessione attuale e (secondo il "Watch" in Visual Studio)

Che cosa mi manca qui?

ho cercato

int i = 0; 
HttpContext.Current.Session["i"] = i; 
i++; 

e HttpContext.Current.Session [ "i"] rimane 0.

risposta

11

Vedi value types and reference types.

Il int è un tipo di valore, pertanto verrà memorizzato "così com'è" al momento dell'assegnazione; il tuo listModel è un tipo di riferimento in modo da memorizzare un riferimento all'oggetto nella tua sessione, non il valore dell'oggetto.

Dovrai creare una nuova istanza di listModel se vuoi che la tua sessione non venga toccata.

+0

Grazie CodeCaster - ci provo. Ho solo pensato che fosse sempre il valore che veniva memorizzato. – CJe

+0

il tuo diritto con quello che hai pensato, i valori sono memorizzati nelle sessioni – rajeemcariazo

4

Nel primo esempio si memorizza un riferimento all'oggetto (La posizione di memoria degli elenchi). Quindi, se lo list viene aggiornato, si rifletterà nella sessione. Questo è un tipo di riferimento.

Nel secondo esempio si utilizza un tipo di valore:

int i = 0; 
HttpContext.Current.Session["i"] = i; 
i++; 

Dichiarate i e impostarlo a 0 (tipo Value)

si memorizza il valore di 0 nella sessione. (Non la posizione di memoria di i)

È incrementare i ma la sessione ha ancora il valore 0

1

Nel primo esempio la variabile di sessione punta a un reference in modo che viene aggiornata in quanto i due riferimenti puntano a lo stesso valore.

La seconda variabile di sessione punta a un tipo primitive (value) in modo da avere copie separate del valore.

0

Il modo corretto dovrebbe essere:

int i = 0; 
    i++; 
    HttpContext.Current.Session["i"] = i; 

il HttpContext.Current.Session [ "i"] rimane 1.

1

Nel primo esempio la variabile di sessione punta a un riferimento in modo viene aggiornato perché i due riferimenti puntano allo stesso valore.

così prima di assegnare alla sessione di convertire in JSON e poi assegnare

HttpContext.Current.Session[listModelType + "ListModel"] = JsonConvert.SerializeObject(listModel); 

Nota: JsonConvert è dallo spazio nome Newtonsoft.Spazio dei nomi Json in C#

In seconda riga se il valore cambia nell'oggetto listModel che non riflette la sessione. ma quando si vuole prelevare il valore dalla sessione si dovrebbe convertire in oggetto form JSON

if (HttpContext.Current.Session[listModelType + "ListModel"] != null) 
{ 

    listModel = JsonConvert.DeserializeObject<*CLASS name of lsitmodel*>((string)HttpContext.Current.Session[listModelType + "ListModel"]); 

} 
0

Nel primo esempio la variabile di sessione punta a un riferimento in modo che viene aggiornata in quanto i due riferimenti puntano allo stesso valore.

così prima di assegnare alla sessione di convertire in JSON e poi assegnare

HttpContext.Current.Session[listModelType + "ListModel"] = JsonConvert.SerializeObject(listModel); 

Nota: JsonConvert è dallo spazio nome Newtonsoft.Json namespace in C#

in seconda linea se il valore cambia in listModel oggetto che non riflette la sessione. ma quando vuoi recuperare il valore dalla sessione dovresti convertire in oggetto JSON

if (HttpContext.Current.Session[listModelType + "ListModel"] != null) { 

     listModel = JsonConvert.DeserializeObject<*CLASS name of lsitmodel*>((string)HttpContext.Current.Session[listModelType + "ListModel"]); 

    }