【问题标题】:Asp.Net Mvc shopping cart storing selected items in cart best approachAsp.Net Mvc 购物车将所选商品存储在购物车中的最佳方法
【发布时间】:2014-01-16 17:19:42
【问题描述】:

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

  1. 数据库中的临时表?签出项目后删除表格
  2. 会话?
  3. 临时数据?
  4. jQuery 数组?
  5. 还有其他方法吗?

请提出建议。

【问题讨论】:

  • 在我的实践中,我更喜欢 Sessions。它比数据库轻得多。 Sessions 尽可能多地保存用户信息。
  • TempData 保留 HTTP 请求时间的信息。这意味着仅从一页到另一页。所以,TempData 不能用于购物车
  • @simoco - 如果您想在请求之间保留数据,那么会话非常棒。但是,如果您在 .NET 中使用 In-Proc 会话,并且 a) 应用程序池回收或 b) 您有一个负载平衡的服务器集群,您可以预期您的会话会随机消失。
  • 如何将购物车数据存储在 cookie 中?这样,即使用户在几天后再次访问您的网站,也可以访问他们的购物车。

标签: asp.net-mvc shopping-cart


【解决方案1】:

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

  • 已认证
  • 未通过身份验证

还有更多可能的场景:

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

所以我认为最好的方法是让实体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) 将商品添加到购物车

cart_id 必须是 Guid

这种方法有几个好处:

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

等等

您的问题的答案看起来更接近您的“数据库中的临时表?签出项目后删除表”。此外,它更自然。想象自己在商店里,你有一个临时购物车,你可以在逛商店时将物品放入这个购物车,最后付款,完成后从购物车中删除所有内容。

将此方法与会话进行比较:

  • 如果服务器出现故障,会话将丢失。您必须对会话使用 SQL 持久性。
  • 如果使用 SQL,则必须使用aspnet_regsql。它只会创建额外的表来保存您的会话数据。就个人而言,我不喜欢它们,我想保持我的数据库干净。我认为具有 SQL 持久性的会话过于通用。
  • 如果您尝试获取一些数据用于统计目的,可能会很麻烦。使用我的方法,您可以轻松做到这一点。

【讨论】:

  • 如果用户有 cart_id 并且通过了身份验证会发生什么。但随后通过另一台计算机使新的购物车未经身份验证,然后登录。现在同一用户有两个购物车。
  • 这将是应用程序的一个绝妙功能。为什么你说它好像它是坏的? :))
【解决方案2】:

最简单的解决方案是使用会话。会话已经能够维护从请求到请求的数据,而无需大量推出您自己的解决方案(数据库表、自定义 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

代码

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

>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多