问题背景:
我有一个会话对象,用于存储名为'CartItems'的对象列表。我将此对象转换为实际实例,将其设置为另一个List变量,然后最终清除列表。然后将其发送到ViewBag变量并发送到View。
问题:
我想要做的可能是不可能的,但是目前我一清楚CartItems的列表实例,所有对此的引用都会丢失。请参阅以下代码:
public ActionResult Complete(string OrderId)
{
//Retrieve the CartItem List from the Session object.
List<CartItem> cartItems = (List<CartItem>)Session["Cart"];
//Set the list value to another instance.
List<CartItems>copyOfCartItems= cartItems;
//Set the ViewBag properties.
ViewBag.OrderId = OrderId;
ViewBag.CartItems = copyOfCartItems;
//Clear the List of CartItems. This is where the **issue** is occurring.
//Once this is cleared all objects that have properties set from
//this list are removed. This means the ViewBag.CartItems property
//is null.
cartItems.Clear();
return View(ViewBag);
}
清除列表后,我可以存储此值而不会丢失吗?
答案 0 :(得分:1)
当你这样做时
ListcopyOfCartItems = cartItems;
您正在通过copyOfCartItems的名称创建另一个变量,该变量指向同一个对象cartItems。换句话说,cartItems和copyOfCartItems现在是同一对象的两个名称。
所以当你做cartItems.clear();您正在清除基础对象上的所有列表项。
要解决此问题,请复制cartItems,而不是创建参考
List<CartItems> copyOfCartItems = new List<CartItems>();
cartItems.ForEach(copyOfCartItems.Add); //copy from cartItems
答案 1 :(得分:0)
如果您要清除Session["Cart"]
,请使用Session.Remove("Cart")