首先是一些背景,我们正在创建一个新的“eGov”应用程序。最终,公民可以申请许可证并支付许可证,并在线支付水电费和停车票。我们的愿景是购物车,因此一个人可以在一次交易中支付多件物品。为了使事情更好地组织起来,我们将把每个部分分成不同的项目。这也允许我在一个项目上工作而另一个开发人员在另一个项目上工作。付款人可以是注册用户,也可以保持未注册状态。我们认为来自我们管辖范围之外的人可能不想只是为了支付他们的停车罚单或支付一次性营业执照而注册。
此项目将在Windows Server 2008和IIS7上并使用ASP.NET MVC 3.我们可能会使用单个域(可能是egov.domain.gov)和多个子目录(/ cart,/ permit,/ billing) ,等等)虽然这还没有100%决定。
现在问题。我们如何跨多个项目跟踪购物车?有人谈到使用在某一点或使用状态机到期的cookie。我们不确定使用会话ID是否有效。如果我们使用状态机,我从来没有使用它,只能在概念中理解它(它适用于多台机器并且SO使用它)。
另外一点,我们将在VMWare服务器上构建它,因此将来可能会在多台服务器上运行。
你会用什么?为什么?
更新:似乎很多人似乎建议将购物车存放在HttpContext中。这在多个应用程序中是否相同?
答案 0 :(得分: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>
然后我创建了一个包含两个类的类库:Cart
和CartItem
。
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();
}
这似乎对我有用。