我正在制作一个小型电子书商店作为一个项目。我将购物车存储在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)
添加到卡中使用了类似的方法,该方法运行良好。
答案 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));
这样代码就引用了相同的内存中对象,而不仅仅是一个直观地表示相同内容的对象。