如果我在会话中放置一个自定义类,那么在一个动作方法中,我从会话中获取该类的实例,并填充一些字段,我注意到当另一个控制器从会话中获取该类时,这些字段将被填充.即使在第一次调用之后没有将更新的类保存回会话中.
这是会话对象的典型行为吗?
我认为我必须在会话中使用关键字'static'来实现这一点
谢谢
由于您的类是引用类型,因此这是正常行为.这是记忆中发生的事情:
您实例化一个对象并将其放入会话中
var someObj = new SomeObject();
Session["someObj"] = someObj;
Run Code Online (Sandbox Code Playgroud)
在此阶段,将在堆上创建一个新对象,Session["someObj"]并指向此对象.
您从控制器A中的会话中检索对象并修改某些属性但不调用Save:
var someObj = (SomeObject)Session["someObj"];
someObj.SomeProp = "new value";
Run Code Online (Sandbox Code Playgroud)
现在someObj指向您之前在堆上创建的同一个对象.作为someObj参考,您实际上是在内存中修改原始对象.
您从Controller B中的会话中检索对象:
var someObj = (SomeObject)Session["someObj"];
Run Code Online (Sandbox Code Playgroud)
现在someObj指向已修改的相同内存位置.
| 归档时间: |
|
| 查看次数: |
815 次 |
| 最近记录: |