C#从存储在ASP会话中的列表中删除对象

时间:2015-07-17 16:04:20

标签: linq session listbox

我正在制作一个小型电子书商店作为一个项目。我将购物车存储在ASP会话中作为对象列表。现在,在结帐页面中,我在列表框中显示对象列表,并允许用户在需要时删除项目。这是我的代码

protected void btnCart_Click(object sender, EventArgs e) { List<Title> cartItems = (List<Title>)Session["eStoreCart"]; int itemToRemove = Int32.Parse(lbCartItems.SelectedItem.Value); Title ttl = ebs.Titles.SingleOrDefault(t => t.TitleId == itemToRemove); cartItems.Remove(ttl); Session["eStoreCart"] = cartItems; FillListBox(); } 显然,cartItems中的项目数在调用Remove()方法之前和之后是相同的。我哪里错了? 使用cartItems.Add(ttl)添加到卡中使用了类似的方法,该方法运行良好。

2 个答案:

答案 0 :(得分:0)

而不是

  Title ttl = ebs.Titles.SingleOrDefault(t => t.TitleId == itemToRemove);

尝试

 Title ttl = cartItems.SingleOrDefault(t => t.TitleId == itemToRemove);

即。而不是在'ebs'中搜索标题(不确定它包含什么,在OP代码中不清楚),直接搜索会话对象中的项目然后将其删除。

答案 1 :(得分:0)

尝试删除项目时.Remove()方法is going to check for equality。是Title implement IEquatable<Title>吗?如果不是,那么检查相等性将是默认的,对于对象是参考相等。并且这里不太可能满足参考平等。

实施IEquatable<Title>可能是理想的方法。只需将该接口添加到Title实现并实现其一个方法:

public bool Equals(Title other) 
{
    if (other == null) 
        return false;

    if (this.SomeValue == other.SomeValue)
        return true;
    else 
        return false;
}

这会将相等逻辑放在它所属的模型上。如果做不到这一点,你的代码在检查相等性时必须更加程序化。也就是说,您首先必须在cartItems中找到您正在寻找的元素,然后删除对象,而不是尝试删除自身的对象存在于ebs.Titles中。类似的东西:

cartItems.Remove(cartItems.Single(c => c.SomeValue == ttl.SomeValue));

这样代码就引用了相同的内存中对象,而不仅仅是一个直观地表示相同内容的对象。