2013-07-31 59 views
0

我必須誤會會話的某些內容。我試圖存儲一些信息,所以讓我提供詳細信息。訪問存儲在會話中的對象的屬性

這是我的「容器」類,它包含一個業務對象列表。該容器存儲在會話中。

public class MySessionContainer { 
    private IList<SomeBusinessObjectType> _BusinessObjectList = new List<SomeBusinessObjectType>(); 
    public IList<SomeBusinessObjectType> BusinessObjectList { 
     get { return _BusinessObjectList; } 
     set { _BusinessObjectList = value; } 
    } 
} 

我有一組形成一個嚮導/多步驟的過程頁面,他們都需要訪問的容器,它是在會話的業務對象的列表。

第一頁增加了業務對象在會話列表中,所以這種代碼是用來實現這一目標:

string key = GetKeyForCurrentUser(); 
MySessionContainer container = (MySessionContainer) Session[key]; 

SomeBusinessObjectType businessObject = /* Get object from view. */; 

container.BusinessObjectList.Add(businessObject); 

產生的關鍵字總是在所有的頁面相同。

但是,當用戶到達第二頁時,容器按預期進行會話,但業務對象列表爲空,這不是我所期望的。如果第一頁添加了一個業務對象,那麼它應該在第二頁和後續頁中......對嗎?

有沒有什麼我不理解會話在ASP.net?爲什麼容器在會話中但不在列表中?當ASP.net從會話寫入/讀取時,該列表是否與容器對象串行化?

+0

您是否嘗試過在修改它之後將它填充到會話中? – JerKimball

+0

@JerKimball我曾經想過,但我認爲在一個請求中,session中的值始終是相同的參考。 – kevin628

+0

我不得不檢查一些東西(遠離asp.net一段時間),但我的預感是你得到了一個反序列化的訪問副本,而不是原始參考。 – JerKimball

回答

2

您需要將它寫回會話。

看一看的例子下會話變量:

// When retrieving an object from session state, cast it to 
// the appropriate type. 
ArrayList stockPicks = (ArrayList)Session["StockPicks"]; 

// Write the modified stock picks list back to session state. 
Session["StockPicks"] = stockPicks; 
序列化的對象圖時

ASP Session State Overview

+0

字符串和'ArrayList'的原因是因爲它們不能被引用更新。字符串是不可變的,ArrayList是值類型。然而,'MySessionContainer'和'List <>'是引用類型。因此,他們不需要被「寫回會話」。 – Jay

+0

這是問題所在。不知道爲什麼我以前完全不在意這個事實。 – kevin628

2

會話對象不在不同用戶之間共享,因此GetKeyForCurrentUser無用。你可以使用一些簡單的字符串作爲鍵。存儲在Session中的對象必須是可序列化的,因此SomeBusinessObjectType也必須是可序列化的。

+0

關於GetKeyForCurrentUser的好處。 SomeBusinessObject類型被標記爲可序列化。我認爲根本問題是我沒有寫回會話。 – kevin628

+0

啊是的。在我使用Session的時候很久以前。他們應該已經提供了更多的初始名稱和方法來進行操作。 – TakeMeAsAGuest

0

Initalizers可以意外動作。嘗試使用延遲加載的屬性,如果你不想初始化集合了父類的:

public class MySessionContainer { 
    private IList<SomeBusinessObjectType> _BusinessObjectList; 
    public IList<SomeBusinessObjectType> BusinessObjectList { 
     get { return (_BusinessObjectList ?? 
        (_BusinessObjectList = new List<SomeBusinessObjectType>()) ; } 
     set { _BusinessObjectList = value; } 
    } 
} 

這將允許反序列化設置你的清單,任何干將將永遠不會得到你的收藏一個空值。

另外,確保圖中的每個對象都可以被序列化。有關更多信息,請參閱here

This question也可能與您的一些相關。