我正在尝试在Asp.Net Mvc3中创建购物车应用程序。我很困惑,在将用户选择的项目临时存储到购物车时采取正确的决定。在结账过程之前,暂时存放购物车物品的最佳方法是什么。
请建议。
答案 0 :(得分:7)
据我了解,您有两种类型的用户:
还有更多可能的情景:
所以我认为最好的方法是让实体User
与实体Cart
链接,与实体Item
链接,如下所示:
User <--- one-to-one ---> Cart <--- one-to-many ---> Item
我建议使用以下方法。每当用户点击页面上的“添加到购物车”按钮时,您的javascript代码必须:
/Cart/GetNewId
)获取新的cart_id,并将此变量添加到Cookie中。/Cart/AddItem
) cart_id必须为Guid
。
这种方法有几个好处:
User
(Cart
实体内部)为空。当用户对自己进行身份验证时,您可以通过仅设置User
属性轻松地将现有购物车与所有现有项目分配给用户。等
您的问题的答案看起来更接近您的“数据库中的临时表?一旦项目签出后删除表”。而且,它更自然。在商店里想象自己,你有一个临时购物车,你可以在商店里走路时把物品放进这个购物车,最后付款,并在你完成后从你的购物车中删除所有东西。
将此方法与Sessions进行比较:
答案 1 :(得分:3)
最简单的解决方案是使用会话。会话已经能够从请求到请求维护数据,而无需广泛地推出自己的解决方案(数据库表,自定义cookie等)。
但是,由于默认会话设置是使用In-Proc(意味着存储在内存中),因此您必须考虑诸如应用程序池回收之类的事件,有多少用户将同时维护购物车(大量内存使用) )或负载平衡的服务器集群(服务器之间不共享的内存)。
为了缓解这些情况,请切换会话提供程序以使用SQL存储会话数据。为了setup SQL session storage,需要做一些事情,但是,数据可以被多个服务器访问,并且在应用程序池回收的情况下仍然存在。
需要执行的步骤是:
aspnet_regsql.exe -S ServerName -E -ssadd -sstype c -d DatabaseName
代码
<configuration>
<system.web>
<sessionState mode="SQLServer"
sqlConnectionString="Your Sql Connection String" />
</system.web>
</configuration
&GT;