Asp.Net Mvc购物车在购物车中存储所选商品的最佳方法

时间:2013-12-29 19:17:39

标签: asp.net-mvc shopping-cart

我正在尝试在Asp.Net Mvc3中创建购物车应用程序。我很困惑,在将用户选择的项目临时存储到购物车时采取正确的决定。在结账过程之前,暂时存放购物车物品的最佳方法是什么。

  1. 数据库中的临时表?签出项目后删除表格
  2. 会话?
  3. TempData的?
  4. Jquery Array?
  5. 其他任何方式?
  6. 请建议。

2 个答案:

答案 0 :(得分:7)

据我了解,您有两种类型的用户:

  • 认证
  • 未经过身份验证

还有更多可能的情景:

  • 购买后,用户可以通过身份验证。
  • 用户可以在流程中间验证自己(将一个项目添加到购物车,然后进行身份验证,然后再添加一个项目)
  • 用户已通过身份验证,并且已经可能在购物车中有内容(例如,昨天添加了一个项目)。
  • 用户未经过身份验证,但可能已经在一个月前添加了购物车中的商品(您不想错过它,对吗?)

所以我认为最好的方法是让实体User与实体Cart链接,与实体Item链接,如下所示:

User <--- one-to-one ---> Cart <--- one-to-many ---> Item

我建议使用以下方法。每当用户点击页面上的“添加到购物车”按钮时,您的javascript代码必须:

  1. 从Cookie中获取变量(例如,cart_id)
  2. 如果找不到cart_id,请通过ajax调用(/Cart/GetNewId)获取新的cart_id,并将此变量添加到Cookie中。
  3. 通过ajax电话(/Cart/AddItem
  4. 将商品添加到购物车

    cart_id必须为Guid

    这种方法有几个好处:

    • 在客户端上,您只保留cart_id。
    • 如果客户关闭浏览器,他可以在几天,几个月或几年内回来(取决于cookie设置)
    • 您将所有重要信息保存在数据库中。它不依赖于服务器设置,您可以轻松地将服务器迁移到不同的托管服务提供商等。
    • 当用户未经过身份验证时,属性UserCart实体内部)为空。当用户对自己进行身份验证时,您可以通过仅设置User属性轻松地将现有购物车与所有现有项目分配给用户。

    您的问题的答案看起来更接近您的“数据库中的临时表?一旦项目签出后删除表”。而且,它更自然。在商店里想象自己,你有一个临时购物车,你可以在商店里走路时把物品放进这个购物车,最后付款,并在你完成后从你的购物车中删除所有东西。

    将此方法与Sessions进行比较:

    • 如果服务器出现故障,会话将丢失。您必须将SQL持久性用于会话。
    • 如果您使用SQL,则必须使用aspnet_regsql。它将仅创建其他表以保留会话数据。就个人而言,我不喜欢他们,我想保持我的数据库清洁。我认为使用SQL持久性的会话太通用了。
    • 如果您尝试获取某些数据用于统计目的,则可能会变得很痛苦。通过我的方法,您可以轻松完成此任务。

答案 1 :(得分:3)

最简单的解决方案是使用会话。会话已经能够从请求到请求维护数据,而无需广泛地推出自己的解决方案(数据库表,自定义cookie等)。

但是,由于默认会话设置是使用In-Proc(意味着存储在内存中),因此您必须考虑诸如应用程序池回收之类的事件,有多少用户将同时维护购物车(大量内存使用) )或负载平衡的服务器集群(服务器之间不共享的内存)。

为了缓解这些情况,请切换会话提供程序以使用SQL存储会话数据。为了setup SQL session storage,需要做一些事情,但是,数据可以被多个服务器访问,并且在应用程序池回收的情况下仍然存在。

需要执行的步骤是:

  1. 设置sql server以使用会话 - aspnet_regsql.exe -S ServerName -E -ssadd -sstype c -d DatabaseName
  2. 相应地更新您的web.config
  3.   

    代码

      <configuration>
          <system.web>
            <sessionState mode="SQLServer"
              sqlConnectionString="Your Sql Connection String" />
          </system.web>
        </configuration
    

    &GT;