1

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

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

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

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

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

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

4

5 回答 5

3

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

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

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

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

于 2012-08-13T10:48:14.347 回答
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; }
}
于 2012-08-13T10:45:55.163 回答
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();
于 2012-08-13T10:44:08.593 回答
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

于 2012-08-13T10:41:42.040 回答
0

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

将列表保存到 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]);
    }
}
于 2012-08-13T10:54:02.137 回答