【问题标题】:How can I keep track of a shopping cart across multiple projects?如何跨多个项目跟踪购物车?
【发布时间】:2011-11-15 09:53:37
【问题描述】:

首先是一些背景知识,我们正在创建一个新的“eGov”应用程序。最终,公民可以申请许可证并支付许可证费用,同时在线支付水电费和停车罚单。我们的愿景是有一个购物车,因此人们可以在一次交易中支付多件商品。为了更好地组织事情,我们将把每个部分分成一个不同的项目。这也使我可以在另一个开发人员从事另一个项目的同时从事一个项目。付款人可以是注册用户,也可以保持未注册状态。我们认为,我们管辖范围以外的人可能不想仅仅为了支付停车罚单或一次性营业执照而注册。

该项目将在 Windows Server 2008 和 IIS7 上使用 ASP.NET MVC 3。我们可能会使用单个域(可能是 egov.domain.gov)和多个子目录(/cart、/permit、/billing等)虽然这还不是 100% 决定的。

现在的问题。我们如何跨多个项目跟踪购物车?有人谈到使用在某个时间点过期的 cookie 或使用状态机。我们不确定使用会话 ID 是否可行。如果我们使用状态机,我从未使用过它,只是从概念上理解它(它可以跨多台机器工作,所以使用它)。

另外一点,我们将在 VMWare 服务器上构建它,因此将来有可能在多个服务器上运行它。

你会使用什么,为什么?

更新:似乎许多人似乎建议将购物车存储在 HttpContext 中。这在多个应用程序中是否相同?

【问题讨论】:

    标签: e-commerce shopping-cart httpcontext


    【解决方案1】:

    首先,您需要设置 SQL Server 以接受会话状态连接。

    然后将以下内容添加到您的 Web.config 文件中:

    <sessionState mode="SQLServer" sqlConnectionString="Server=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=ASPState;Application Name=name" timeout="20" allowCustomSqlDatabase="true" />` within `<system.web>
    

    然后我创建了一个包含两个类的类库:CartCartItem

    CartItem 定义为保存每个单独的购物车项目

    [Serializable]
    public class CartItem
    {
        [Key]
        public int RecordId { set; get; }
        public string ItemNumber { set; get; }
        public string Description { set; get; }
        public DateTime DateTimeCreated { set; get; }
        public decimal Cost { get; set; }
    }
    

    Cart 与您的购物车配合使用

    public class Cart
    {
        HttpContextBase httpContextBase = null;
        public const string CartSessionKey = "shoppingCart";
    
        /// <summary>
        /// Initializes a new instance of the <see cref="ShoppingCart"/> class.
        /// </summary>
        /// <param name="context">The context.</param>
        public Cart(HttpContextBase context)
        {
            httpContextBase = context;
        }
    
        /// <summary>
        /// Gets the cart items.
        /// </summary>
        /// <returns></returns>
        public List<CartItem> GetCartItems()
        {
            return (List<CartItem>)httpContextBase.Session[CartSessionKey];
        }
    
        /// <summary>
        /// Adds to cart.
        /// </summary>
        /// <param name="cartItem">The cart item.</param>
        public void AddToCart(CartItem cartItem)
        {
            var shoppingCart = GetCartItems();
    
            if (shoppingCart == null)
            {
                shoppingCart = new List<CartItem>();
            }
    
            cartItem.RecordId = shoppingCart.Count + 1;
            cartItem.DateTimeCreated = DateTime.Now;
            shoppingCart.Add(cartItem);
    
            httpContextBase.Session[CartSessionKey] = shoppingCart;
        }
    
        /// <summary>
        /// Removes from cart.
        /// </summary>
        /// <param name="id">The id.</param>
        public void RemoveFromCart(int id)
        {
            var shoppingCart = GetCartItems();
            var cartItem = shoppingCart.Single(cart => cart.RecordId == id);
            shoppingCart.Remove(cartItem);
            httpContextBase.Session[CartSessionKey] = shoppingCart;
        }
    
        /// <summary>
        /// Empties the cart.
        /// </summary>
        public void EmptyCart()
        {
            httpContextBase.Session[CartSessionKey] = null;
        }
    
        /// <summary>
        /// Gets the count.
        /// </summary>
        /// <returns></returns>
        public int GetCount()
        {
            return GetCartItems().Count;
        }
    
        /// <summary>
        /// Gets the total.
        /// </summary>
        /// <returns></returns>
        public decimal GetTotal()
        {
            return GetCartItems().Sum(items => items.Cost);
        }
    }
    

    为了对此进行测试,首先在我的家庭控制器的购物车项目中,我做了以下操作:

        public ActionResult Index()
        {
            var shoppingCart = new Cart(this.HttpContext);
            var cartItem = new CartItem
            {
                Description = "Item 1",
                ItemNumber = "123"
                Cost = 20,
                DateTimeCreated = DateTime.Now
            };
    
            shoppingCart.AddToCart(cartItem);
    
            cartItem = new CartItem
            {
                Description = "Item 2",
                ItemNumber = "234"
                Cost = 15,
                DateTimeCreated = DateTime.Now
            };
    
            shoppingCart.AddToCart(cartItem);
    
            var viewModel = new ShoppingCartViewModel
            {
                CartItems = shoppingCart.GetCartItems(),
                CartTotal = shoppingCart.GetTotal()
            };
    
            return View(viewModel);
        }
    

    在我的第二个项目的家庭控制器中,我添加了以下内容:

        public ActionResult Index()
        {
            var shoppingCart = new Cart(this.HttpContext);
            var cartItem = new CartItem
            {
                Description = "Item 3",
                ItemNumber = "345"
                Cost = 55,
                DateTimeCreated = DateTime.Now
            };
    
            shoppingCart.AddToCart(cartItem);
    
            return View();
        }
    

    这似乎对我很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多