【问题标题】:ASP.NET/MVC Shopping Cart Add ItemASP.NET/MVC 购物车添加商品
【发布时间】:2014-06-10 20:09:43
【问题描述】:

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

我的商店实体包含一个篮子的 DBSet。我的篮子模型,包含一个篮子项目列表。问题是,我的“AddtoBasket”函数,需要在当前的BasketItems列表中进行搜索,判断是否已经存在相同的“basketitem”,如果存在,增加数量。我在购物车逻辑上处于死胡同。我将如何搜索当前的“basketItems”列表?

存储上下文

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

【问题讨论】:

标签: c# asp.net asp.net-mvc-4 shopping-cart


【解决方案1】:

好吧,我猜您收到的购物篮项目没有 BasketItemID(因为它是键,您可能会获得它的默认值)。这里的关键问题是如何定义“已经存在”。为了论证的目的,我将假设 SellerId(请按照 PascalCase 为您的属性,这通常是属性名称的公认约定)和 sku(无论是什么)需要相等。因此,在当前情况下,显而易见的方法是:

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

现在,您会注意到我没有指定您将如何检索您当前的购物篮。那是因为这是一个架构决策,至少从您提供的内容来看,我没有看到您实施它。进行查找的最佳方法是让您能够按用户查找购物篮(这意味着将 UserId(无论您的唯一用户标识符是什么)添加到您的 Basket 类。无论您实现用户的功能一次拥有 2 个或更多活动篮子取决于您的用例和要求 - 您应该妥善处理。 根据我(和许多其他人)的说法,存储用户 ID/任何其他唯一标识符的最佳位置是 Session(取决于您的身份验证模式,您可能有其他选择: see this topic for more details ) 然后,查找变得像这样简单(如果每个用户只有 1 个活动购物篮 - 处理多购物篮的情况并没有明显复杂):

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);

【讨论】:

    猜你喜欢
    • 2015-07-26
    • 2020-01-14
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2015-03-31
    相关资源
    最近更新 更多