我一定是对会话的误解。我正在尝试存储一些信息,所以让我详细说明。
这是我的“容器”类,它包含业务对象列表。该容器存储在会话中。
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 :(得分: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;
答案 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也可能与您的相关性。