我们使用List<object>
类型作为dropdownlist的数据源。
流程:
List<object>
)中为会话分配值(!ispostback
。)ddl_SelectedIndexChanged
事件代码:
List<Loc> locList = new List<Loc>();
locList = (List<Loc>)Session["Loc"];
locID = "xxx";
locList.RemoveAt(locList.FindIndex(FindLocation));
问题:
项目也从基础源(会话)中删除。
答案 0 :(得分:4)
问题是您正在操纵存储在会话中的列表,而不是副本。相反,如果你做这样的事情:
List<Loc> locList = new List<Loc>((List<Loc>)Session["Loc"]);
locID = "xxx";
locList.RemoveAt(locList.FindIndex(FindLocation));
您正在操作列表的副本,原件不会更改。
答案 1 :(得分:4)
听起来您正在将列表存储在会话中,将其取出并进行变更。实际上,如果从进程内状态切换到分布式状态或数据库状态,您可能会看到不同的结果。
问题是处于进程中状态只有一个列表。它没有序列化/反序列化,因此当您删除项目时它会被删除。您可以轻松克隆列表:
locList = new List<Loc>(locList);
应该解决这个问题。对于其他状态实现,数据被序列化,并且每个反序列化的副本是分开的,因此您将看不到这一点。但我不会依赖国家实施。就个人而言,我从未理解为什么这种改变行为的微妙之处是允许的;即使在进行中,我也希望始终序列化/反序列化。