如果我在会话中放置一个自定义类,那么在一个动作方法中,我从会话中获取该类的实例,并填充一些字段,我注意到当另一个控制器从会话中获取该类时,这些字段将被填充。即使在第一次调用之后没有将更新的类保存回会话中。
是会话对象的典型行为吗?
我认为我必须在会话中使用关键字'static'来实现此目的
感谢
答案 0 :(得分:6)
由于您的类是引用类型,因此这是正常行为。以下是记忆中发生的事情:
您实例化一个对象并将其放入会话
var someObj = new SomeObject();
Session["someObj"] = someObj;
在此阶段,在堆上创建一个新对象,Session["someObj"]
指向此对象。
您从控制器A中的会话中检索对象并修改某些属性,但不要调用Save
:
var someObj = (SomeObject)Session["someObj"];
someObj.SomeProp = "new value";
现在someObj
指向您之前在堆上创建的同一个对象。由于someObj
只是一个引用,实际上是在内存中修改原始对象。
您从Controller B中的会话中检索对象:
var someObj = (SomeObject)Session["someObj"];
现在someObj
指向已修改的相同内存位置。
答案 1 :(得分:1)
是会话对象的典型行为吗?
是的,但是,它通常是典型的.NET对象。您接受了引用,因此您正在更改会话仍然指向的原始对象。
答案 2 :(得分:0)
由于您的会话在内存中,因此这是预期的行为。如果将会话存储在外部存储中,则必须将对象保存回会话以获取相同的行为。我会尽量避免这种发展,因为当你改变商店时行为完全不同。