我想存储购物篮的商品代码以及用户在会话数组中选择的数量。
我不知道将这些数据存储在最简单,最合适的数据类型中。
我觉得我不能只在会话中存储我自己的对象吗?
Product code, Quantity CQAR/HINCACOC, 10 CAAA/VINNYMIN, 20
我希望能够再次取出这些价值,以便将它们放入购物篮中。
我尝试了List<Dictionary<string, int>>
和ArrayList
,但似乎都没有按预期工作。
答案 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]);
}
}