访问会话中存储的对象的属性

时间:2013-07-31 18:10:59

标签: c# asp.net session

我一定是对会话的误解。我正在尝试存储一些信息,所以让我详细说明。

这是我的“容器”类,它包含业务对象列表。该容器存储在会话中。

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从会话写入/读取它时,列表是否未使用容器对象序列化?

3 个答案:

答案 0 :(得分:2)

不会在不同用户之间共享会话对象,因此GetKeyForCurrentUser无用。你可以使用一些简单的字符串作为密钥。存储在Session中的对象必须是可序列化的,因此SomeBusinessObjectType也必须是可序列化的。

答案 1 :(得分:2)

您需要将其写回会话。

查看Session Variables下的示例:

// 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

答案 2 :(得分:0)

在序列化对象图时,初始化器可能会意外动作。如果您不想从父类初始化集合,请尝试使用延迟加载的属性:

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

这将允许反序列化来设置列表,任何getter永远不会为您的集合获取null值。

此外,请确保图表中的每个对象都可以序列化。有关详细信息,请参阅here

This question也可能与您的相关性。