2010-03-14 25 views
2

如果我在會話中放置了自定義類,那麼在動作方法中,我從會話中獲得該類的實例,並填充一些字段,我注意到當不同的控制器獲取該類時從會話中,這些字段被填充。即使在第一次通話後沒有將更新的課程保存在會話中。會話中的Asp.net mvc類參考

這是會話對象的典型行爲嗎?

我想我不得不對類使用關鍵字「靜態」在會議上要做到這一點

感謝

回答

1

是會話對象這個典型的行爲?

嗯是的,但它是一般的.NET對象的典型。您接受了參考,因此您正在更改會話仍指向的原始對象。

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. 您檢索會話對象在控制器B:

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

    現在someObj點,已經修改了相同的內存位置。