Session object changes when object is updated in C#

大兔子大兔子 提交于 2019-11-28 12:21:04

See value types and reference types.

The int is a value type so will be stored "as-is" on the moment of assignment; your listModel is a reference type so you store a reference to the object in your session, not the value of the object.

You'll have to create a new instance of listModel if you want the one in your session untouched.

In your first example you are storing a reference to the object (The lists memory location). So if the list is updated it will reflect in the session. This is a reference type.

In the second example you are using a value type:

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

You declare i and set it to 0 (Value type)

You store the value 0 in the session. (Not the memory location of i)

You increment i but the session still has the value 0

In the first example your session variable is pointing to a reference so it gets updated because the two references are pointing to the same value.

The second session variable is pointing to a primitive (value) type so they have separate copies of value.

Chandu Gunji

In the first example your session variable is pointing to a reference so it gets updated because the two references are pointing to the same value.

so before assigning to the session you convert it into Json and then assign

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

Note: JsonConvert is from name space Newtonsoft.Json namespace in c#

In second line if value changes in listModel object that does't reflect session. but when you want to retreive the value from session you should convert to object form Json

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

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

}
user2552241

The correct way should be:

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

the HttpContext.Current.Session["i"] remains 1.

In the first example your session variable is pointing to a reference so it gets updated because the two references are pointing to the same value.

so before assigning to the session you convert it into Json and then assign

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

Note: JsonConvert is from name space Newtonsoft.Json namespace in c#

In second line if value changes in listModel object that does't reflect session. but when you want to retreive the value from session you should convert to object form Json

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

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

    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!