我想存储购物篮的商品代码以及用户在会话数组中选择的数量。
我不知道存储这些数据最简单和最合适的数据类型是什么。
我的印象是我不能只在会话中存储我自己的对象?
Product code, Quantity CQAR/HINCACOC, 10 CAAA/VINNYMIN, 20
我希望能够再次取出这些值,以便将它们放入篮子中。
我试过了List<Dictionary<string, int>>
,ArrayList
但似乎都没有按预期工作。
我想存储购物篮的商品代码以及用户在会话数组中选择的数量。
我不知道存储这些数据最简单和最合适的数据类型是什么。
我的印象是我不能只在会话中存储我自己的对象?
Product code, Quantity CQAR/HINCACOC, 10 CAAA/VINNYMIN, 20
我希望能够再次取出这些值,以便将它们放入篮子中。
我试过了List<Dictionary<string, int>>
,ArrayList
但似乎都没有按预期工作。
您可以在会话中存储您自己的自定义对象列表,只要该对象(以及它具有的任何对象依赖项)标记为[Serializable]
. 在这种情况下,您将拥有:
[Serializable]
public class BasketItem
{
public string ProductCode { get; set; }
public int Quantity { get; set; }
}
然后只需将这些对象的集合存储在您的会话中,例如List<BasketItem>
更新:认为我会根据下面的评论进行澄清,因为它是正确的,如果会话存储在进程/内存中,[Serializable]
则不需要。但如果对象存储在状态服务器/SQL 数据库中,则绝对需要,因为对象必须在站点和会话存储之间进行序列化/反序列化。
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; }
}
使用 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();
您是否考虑过 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。
stackoverflow 上有另一个线程描述了满足您要求的解决方案:
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]);
}
}