我正在制作购物车并且为了跟踪购物车,我有一个包含产品视图模型列表的会话。
这是添加到购物车的操作方法:
public ActionResult AddToCart(string id)
{
List<CartVM> cartVMList = new List<CartVM>();
CartVM cartVM = new CartVM();
int productId = Int32.Parse(id);
Db db = new Db();
var result = db.Products.FirstOrDefault(x => x.Id == productId);
decimal price = result.Price;
cartVM.ProductId = productId;
cartVM.Quantity = 1;
cartVM.Price = price;
if (Session["cart"] != null)
{
cartVMList = (List<CartVM>)Session["cart"];
cartVMList.Add(cartVM);
}
else
{
cartVMList.Add(cartVM);
}
Session["cart"] = cartVMList;
//return Content(id);
return RedirectToAction("Index", "ShoppingCart");
}
在添加新产品时有效,例如如果我添加5个新产品,会话将包含5个产品的列表,但如何根据例如ProductId
编辑和删除列表中的特定视图模型?
答案 0 :(得分:0)
我还没有测试过,但以下情况应该有效。您需要做的就是像添加到购物车时一样抓住购物车列表。您只需编辑列表中的对象或从列表中删除它,而不是添加新项目。
从技术上讲,除非Session做了一些特别的事情,否则如果你从会话中得到它,你就不需要将列表重新保存到Session中,因为列表是一个引用类型。
public ActionResult EditCartItem(string id, int quantity, decimal price)
{
if (Session["cart"] != null)
{
var cartVMList = (List<CartVM>) Session["cart"];
var itemToEdit = cartVMList.FirstOrDefault(cartVM => cartVM.Id == id);
if(itemToEdit == null)
return this.HttpNotFound();
itemToEdit.Quantity = quantity;
itemToEdit.Price = price;
}
}
public ActionResult RemoveFromCart(string id)
{
if (Session["cart"] != null)
{
var cartVMList = (List<CartVM>) Session["cart"];
var itemToRemove = cartVMList.FirstOrDefault(cartVM => cartVM.Id == id);
if(itemToRemove == null)
return this.HttpNotFound();
cartVMList.Remove(itemToRemove);
}
}