ASP.NET/MVC购物车添加项目

本文关键字:添加 项目 购物车 MVC NET ASP | 更新日期: 2023-09-27 18:08:15

我正在创建一个ASP。. NET购物车与MVC。

My Store实体包含一个DBSet of Basket。我的篮子模型,包含一个篮子项目列表。问题是,我的"AddtoBasket"函数需要搜索当前的篮项目列表,并确定是否已经存在相同的"篮项目",如果存在,则增加数量。我在购物车逻辑上陷入了死胡同。我该如何搜索我当前的"篮项"列表呢?

存储上下文

public class StoreEntities : DbContext
{
    public DbSet<Order> Order { get; set; }
    public DbSet<OrderItems> OrderItems {get; set;}
    public DbSet<Basket> Basket { get; set; }
    public dbSet<BaskItem> BasketItems {get; set; }

}

模型
public class BasketItem
{
    [Key]
    public int BasketItemID { get; set; }
    public string sellerID { get; set; }
    public string sku { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }
}
    public class Basket
{
    [Key]
    public string BasketID { get; set; }
    public virtual List<BasketItem> BasketItems { get; set; }
    public System.DateTime DateCreated { get; set; }

}

购物车逻辑

public void AddtoBasket(BasketItem basketItem)
    {
        //Search Current Basket for basketItem
        //
        //If item doesnt exists, add it
            if (basketItem == null){
                basketItem = new BasketItem
                {
                    sku = "",
                    sellerID = "",
                    Quantity = 1,
                    Price = 100
                };
                storeDB.BasketItems.Add(basketItem);
                storeDB.SaveChanges();
            }
            else
            {

                    basketItem.Quantity = +basketItem.Quantity;
                    storeDB.SaveChanges();
            }
    }
    #endregion

ASP.NET/MVC购物车添加项目

嗯,我猜您正在接收的篮子项目没有BasketItemID(因为它是键,您可能正在获取其默认值)。这里的关键问题是你如何定义"已经存在"。为了便于讨论,我将假设sellerId(请遵循属性的PascalCase,这是通常接受的属性名称约定)和sku(不管它是什么)需要相等。在当前情况下,最明显的方法是:

var basketItem = <yourCurrentBasket>.BasketItems.
Where(bi => bi.sellerId == basketItem.sellerID && bi.sku == basketItem.sku);

现在,您将注意到我没有指定如何检索当前购物篮。这是因为这是一个架构决策,至少从您提供的信息来看,我没有看到您实现它。执行查找的最佳方法是能够按用户查找购物篮(这意味着向Basket类添加UserId(无论您的唯一用户标识符是什么)。是否实现用户同时拥有2个或更多活动篮子的功能取决于你的用例和需求——你应该适当地处理这个问题。根据我(和很多其他人)存储用户id/任何其他唯一标识符的最佳位置是在Session(取决于您的身份验证模式,您可能有其他选择:有关详细信息,请参阅本主题)然后,查找变得像下面这样简单(在每个用户只有一个活动购物篮的情况下——处理多购物篮的情况并不明显复杂):

public class Basket
{
    [Key]
    public string BasketID { get; set; }
    public virtual List<BasketItem> BasketItems { get; set; }
    public System.DateTime DateCreated { get; set; }
    public Guid UserId { get; set; }
}
...
var basketItem = storeDb.Basket.Where(basket => basket.UserId == currentUserId)
.Include(basket => basket.BasketItems ).Where(bi => bi.sellerId == basketItem.sellerID && bi.sku == basketItem.sku);