会话中的Asp.net mvc类引用

时间:2010-03-14 03:51:14

标签: asp.net-mvc

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

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

我认为我必须在会话中使用关键字'static'来实现此目的

感谢

3 个答案:

答案 0 :(得分:6)

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

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

    var someObj = new SomeObject();
    Session["someObj"] = someObj;
    

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

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

    var someObj = (SomeObject)Session["someObj"];
    someObj.SomeProp = "new value";
    

    现在someObj指向您之前在堆上创建的同一个对象。由于someObj只是一个引用,实际上是在内存中修改原始对象。

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

    var someObj = (SomeObject)Session["someObj"];
    

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

答案 1 :(得分:1)

  

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

是的,但是,它通常是典型的.NET对象。您接受了引用,因此您正在更改会话仍然指向的原始对象。

答案 2 :(得分:0)

由于您的会话在内存中,因此这是预期的行为。如果将会话存储在外部存储中,则必须将对象保存回会话以获取相同的行为。我会尽量避免这种发展,因为当你改变商店时行为完全不同。