2013-07-05 23 views
6

güncelleştirildiğinde oturum nesnesi değişiklikleri Bu gerçekten çok tuhaf bir sorun var ve eminim ki burada açık bir şey eksik. İkinci satır benim oturum nesnesi yürütüldüğünde yanı Burada ne eksikNesne C#

(Visual Studio'da "İzle" göre) güncellendikten sonra

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

: Bu iki hatları var?

I

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

çalıştılar ve HttpContext.Current.Session [ "I"] 0

cevap

11

value types and reference types bakınız kalır.

int bir değer tipidir, bu nedenle atama sırasında "olduğu gibi" kaydedilir; Sizin listModel bir referans türüdür, böylece nesnenin değerine değil, oturumunuzdaki nesneye bir başvuru depolarsınız.

Oturumunuzdaki el değmeden istiyorsanız, yeni bir listModel örneği oluşturmanız gerekir.

+0

Teşekkürler CodeCaster - işinize yarayacaktır. Sadece her zaman depolanan değer olduğunu düşündüm. – CJe

+0

Düşünceleriniz ile sağınızdaki değerler oturumlarda saklanır – rajeemcariazo

4

İlk örneğinizde, nesneye bir başvuru depolıyorsunuz (Listelerin bellek konumu). Yani, list güncellendiyse, oturumda yansıyacaktır. Bu bir referans türüdür. İkinci örnekte

Eğer bir değer türü kullanıyor:

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

Sen i beyan ve Sen oturumda değerini 0 depolamak

0 (Değer türü) olarak ayarlayın. (i Değil hafıza konumu)

Sen i artırmaz ancak oturum hala oturum değişkeni iki referanslar yönlendirdiği için bu nedenle güncellenir bir reference işaret ediyor Birinci örnekte değeri 0

1

sahiptir aynı değer.

İkinci oturum değişkeni, primitive (value) türüne işaret ediyor, böylece ayrı kopya değerleri var.

0

doğru yolu olmalıdır:

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

HttpContext.Current.Session [ "i"] oturumunuz değişken öylesine bir referansa işaret İlk örnekte 1.

1

kalır iki referans aynı değere işaret ettiği için güncellenir.

böylece oturumuna atamadan önce Json dönüştürmek ve sonra

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

Not atayın: JsonConvert adı uzay Newtonsoft değil.Json ad alanı C#

İkinci satırda, değer, oturumu yansıtmayan listModel nesnesinde değişirse. ancak oturumdan değerini almak istediğiniz zaman iki referansın aynı işaret ediyor çünkü güncellenir böylece oturum değişken bir referans işaret ediyor Birinci örnekte formu Json

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

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

} 
0

nesneye dönüştürmek gerekir değer.

böylece Json dönüştürmek ve sonra atamak oturuma atamadan önce

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

Not: JsonConvert C# adı uzay Newtonsoft.Json ad dan İkinci satırda

eğer listModel gösterdikleri değer değişimi oturumu yansıtmayan nesne. ama oturumdan değeri geri almak istediğinizde, nesne biçimine dönüştürmeniz gerekir Json

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

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

    }