【问题标题】:Storing items for a basket in session variables在会话变量中存储篮子的项目
【发布时间】:2012-08-09 13:52:57
【问题描述】:

我想存储购物篮的商品代码以及用户在会话数组中选择的数量。

我不知道存储这些数据最简单、最合适的数据类型是什么。

我觉得我不能只在会话中存储自己的对象?

Product code, Quantity
CQAR/HINCACOC, 10
CAAA/VINNYMIN, 20

我希望能够再次取出这些值,以便将它们放入篮子中。

我尝试了List<Dictionary<string, int>>ArrayList,但似乎都没有按预期工作。

【问题讨论】:

  • 顺便说一句,您不需要使用List<Dictionary<string, int>>,您可以使用Dictionary<string, int>。字典已经是一个“列表”,它几乎是任何在 C# 中实现 IEnumerable 的东西。您可以使用foreach(var key in dict.Keys) 枚举字典。

标签: c# asp.net session variables shopping-cart


【解决方案1】:

您可以在会话中存储您自己的自定义对象列表,只要该对象(以及它具有的任何对象依赖项)标记为[Serializable]。在这种情况下,您将拥有:

[Serializable]
public class BasketItem
{
    public string ProductCode { get; set; }
    public int Quantity { get; set; }
}

然后只需将这些对象的集合存储在您的会话中,例如List<BasketItem>

更新:认为我会根据下面的评论进行澄清,因为它是正确的,如果会话存储在进程/内存中,[Serializable] 不需要。但如果对象存储在状态服务器/SQL 数据库中,则肯定需要这样做,因为对象必须在站点和会话存储之间进行序列化/反序列化。

【讨论】:

  • 添加[Serializable]不是必须的
【解决方案2】:

I get the impression that I can't just store my own object in a session.

为什么会有这种印象?您可以在会话中存储自己的对象。如果您需要网络场并将会话存储在数据库中,请确保使用 [Serializable] 标记您的对象。

要跟踪订单,您可以向对象添加另一个属性。我会建议这样的事情:

[Serializable]
public class CartEntry
{
    public string ProductCode { get; set; }
    public int Quantity { get; set; }
    public int Order { get; set; }
}

【讨论】:

    【解决方案3】:

    使用 BasketItems 创建一个列表

    public class CartItem
    {
       public int ProductID {get;set;}
       public int Quantity {get;set;}
    }
    
    
    List<CartItem> items = new List<CartItem>();
    items.Add(new CartItem() { ProductID = 1, Quantity = 2 })
    
    
    Session["cartItems"] = items;
    
    to get it back again
    
    if(Session["cartItems"] != null)
       List<CartItem> items = (List<CartItem>)Session["cartItems"];
    

    要按产品 ID 获取项目,请参见下文

    int productId = 1;
    
    var cartItem = (from ci in items where ci.ProductID == productId select ci).FirsOrDefault();
    

    【讨论】:

    • 您可以在会话中存储自己的对象
    • 好吧,如果我可以存储自己的对象,那就容易多了。这正是我想做的事情。
    • 如何通过 ProductID 获取数量?
    • @Coulton 在 linq 行之后 (var cartItem = (from ci in items where...),使用“cartItem.Quantity”。cartItem 是从 linq select 语句返回的对象。
    【解决方案4】:

    您是否考虑过 SortedDictionary 对象?在这里找到参考http://msdn.microsoft.com/en-us/library/f7fta44c.aspx。顺便说一句,如果您使用 InProc 或 ASP.NET 会话管理器服务并获得大量访问,您是否确定要使用 Session 执行此操作,您可能会遇到内存不足的问题。考虑将此结构移至 DB 或可能使用 SQL Server 实现 Session。在此处查看会话状态模式信息以及如何配置 SQL Server 状态管理http://msdn.microsoft.com/en-us/library/ms178586.aspx

    【讨论】:

      【解决方案5】:

      stackoverflow 上有另一个线程描述了满足您要求的解决方案:

      Saving List to a Session in ASP.NET

      MSDN 上也描述了整个过程并附有示例:

      http://msdn.microsoft.com/en-us/library/ms178581.aspx

      我还创建了一个示例来展示如何存储和恢复 ArrayList 对象:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      using System.Web.UI;
      using System.Web.UI.WebControls;
      using System.Collections;
      using System.Diagnostics;
      
      public partial class SessionVarTest : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
            string item01 = "Item 1";
            string item02 = "Item 2";
      
            ArrayList MyArrayIn = new ArrayList();
      
            MyArrayIn.Add(item01);
            MyArrayIn.Add(item02);
      
            Session["MyBasket"] = MyArrayIn;
      
            ArrayList MyArrayOut = (ArrayList)Session["MyBasket"];
      
            Debug.WriteLine("Content of ArrayList restored from session var");
            Debug.WriteLine("ArrayList item 1: " + MyArrayOut[0]);
            Debug.WriteLine("ArrayList item 2: " + MyArrayOut[1]);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多