列表与LT;>删除项目问题

时间:2009-12-28 11:31:33

标签: c# asp.net

我们使用List<object>类型作为dropdownlist的数据源。

流程:

  1. 在页面加载事件(List<object>)中为会话分配值(!ispostback。)
  2. ddl_SelectedIndexChanged事件
  3. 中的会话中检索值
  4. 从列表中删除特定项目并绑定到ddl
  5. 代码:

    List<Loc> locList = new List<Loc>();
    locList =  (List<Loc>)Session["Loc"];
    locID = "xxx";
    
    locList.RemoveAt(locList.FindIndex(FindLocation));
    

    问题:

    项目也从基础源(会话)中删除。

2 个答案:

答案 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);

应该解决这个问题。对于其他状态实现,数据被序列化,并且每个反序列化的副本是分开的,因此您将看不到这一点。但我不会依赖国家实施。就个人而言,我从未理解为什么这种改变行为的微妙之处是允许的;即使在进行中,我也希望始终序列化/反序列化。