会话中的Asp.net mvc类引用

Bil*_*lly 2 asp.net-mvc

如果我在会话中放置一个自定义类,那么在一个动作方法中,我从会话中获取该类的实例,并填充一些字段,我注意到当另一个控制器从会话中获取该类时,这些字段将被填充.即使在第一次调用之后没有将更新的类保存回会话中.

这是会话对象的典型行为吗?

我认为我必须在会话中使用关键字'static'来实现这一点

谢谢

Dar*_*rov 6

由于您的类是引用类型,因此这是正常行为.这是记忆中发生的事情:

  1. 您实例化一个对象并将其放入会话中

    var someObj = new SomeObject();
    Session["someObj"] = someObj;
    
    Run Code Online (Sandbox Code Playgroud)

    在此阶段,将在堆上创建一个新对象,Session["someObj"]并指向此对象.

  2. 您从控制器A中的会话中检索对象并修改某些属性但不调用Save:

    var someObj = (SomeObject)Session["someObj"];
    someObj.SomeProp = "new value";
    
    Run Code Online (Sandbox Code Playgroud)

    现在someObj指向您之前在堆上创建的同一个对象.作为someObj参考,您实际上是在内存中修改原始对象.

  3. 您从Controller B中的会话中检索对象:

    var someObj = (SomeObject)Session["someObj"];
    
    Run Code Online (Sandbox Code Playgroud)

    现在someObj指向已修改的相同内存位置.