6

我有这个非常奇怪的问题,我确定我在这里遗漏了一些明显的东西。我有这两行:

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

执行第二行后,我的会话对象也会更新(根据 Visual Studio 中的“Watch”)

我在这里想念什么?

我努力了

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

并且 HttpContext.Current.Session["i"] 保持为 0。

4

6 回答 6

12

请参阅值类型和引用类型

int是一个值类型,因此将在赋值时“按原样”存储;yourlistModel是一种引用类型,因此您在会话中存储对对象的引用,而不是对象的值。

listModel如果您希望会话中的一个不受影响,则必须创建一个新实例。

于 2013-07-05T08:12:43.113 回答
4

在您的第一个示例中,您正在存储对对象的引用(列表内存位置)。因此,如果list更新,它将反映在会话中。这是一个引用类型。

在第二个示例中,您使用的是值类型:

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

您声明i并将其设置为 0(值类型)

您将值存储0在会话中。(不是 的内存位置i

您增加i但会话仍然具有价值0

于 2013-07-05T08:12:50.537 回答
1

在第一个示例中,您的会话变量指向一个引用,因此它会被更新,因为这两个引用指向相同的值。

因此,在分配给会话之前,您将其转换为 Json,然后分配

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

注意:JsonConvert 来自 c# 中的命名空间 Newtonsoft.Json 命名空间

在第二行中,如果 listModel 对象中的值更改不反映会话。但是当您想从会话中检索值时,您应该转换为对象形式的 Json

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

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

}
于 2015-01-08T11:11:20.447 回答
1

在第一个示例中,您的会话变量指向 a reference,因此它会被更新,因为两个引用指向相同的值。

第二个会话变量指向一个primitive (value)类型,因此它们具有单独的值副本。

于 2013-07-05T08:15:30.057 回答
0

正确的方法应该是:

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

HttpContext.Current.Session["i"]保持为 1 。

于 2013-07-05T08:19:15.980 回答
0

在第一个示例中,您的会话变量指向一个引用,因此它会被更新,因为这两个引用指向相同的值。

因此,在分配给会话之前,您将其转换为 Json,然后分配

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

注意:JsonConvert 来自 c# 中的命名空间 Newtonsoft.Json 命名空间

在第二行中,如果 listModel 对象中的值更改不反映会话。但是当您想从会话中检索值时,您应该转换为对象形式的 Json

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

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

    }
于 2015-01-08T11:17:49.950 回答