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 从会话中写入/读取列表时,列表是否没有与容器对象序列化?

4

3 回答 3

2

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

于 2013-07-31T18:26:31.700 回答
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 会话状态概述

于 2013-07-31T18:32:14.623 回答
0

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

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

这将允许反序列化设置您的列表,并且任何 getter 永远不会为您的集合获得空值。

另外,确保图中的每个对象都可以序列化。请参阅此处了解更多信息。

这个问题也可能与您的问题有关。

于 2013-07-31T18:45:56.393 回答