在会话变量中存储篮子的项目

时间:2012-08-13 10:31:25

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

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

我不知道将这些数据存储在最简单,最合适的数据类型中。

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

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

使用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();

答案 3 :(得分:0)

您是否考虑过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

答案 4 :(得分:0)

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]);
    }
}