在覆盖它们之后,我怎样才能保留旧的会话?

时间:2014-04-18 23:14:12

标签: c# asp.net

我正在创建产品和结帐页面。在按下按钮的产品页面中,我这样做

Session["code"] = productLabel.Text;
Session["description"] = descriptionTextBox.Text;
Session["price"] = priceLabel.Text;
Response.Redirect("cart.aspx");

然后在购物车页面中我有

if ((Session["code"] != null))
    {code = (Session["code"]).ToString();}

if ((Session["description"] != null))
    { description = (Session["description"]).ToString(); }

 if ((Session["price"] != null))
    {price = (Session["price"]).ToString(); }

  string item = code + " " + description + " " + price;
  cartList.Items.Add(item);

这是有效的,但是我的问题是当我然后将另一个产品添加到列表中时,它会覆盖我的第一个项目,因此它们一次只有一个项目。我如何跟踪当前/以前在那里的什么?

非常感谢!

2 个答案:

答案 0 :(得分:1)

您可能想要重新考虑整个概念并存储一些自定义类,您可以做的一件事是在购物车中创建一个项目列表并将该列表存储在会话中。

[Serializable]
public class Item
{
    public string Code {get;set;}
    public string Description {get;set;}
    public string Price {get;set;}
}

List<Item> cart=new List<Item>();
Item item=new Item();
item.Code=productLabel.Text;
item.Description=descriptionTextBox.Text;
item.Price=priceLabel.Text;
cart.Add(item);
Session["cart"]=cart;

//then later pull it out...
List<Item> cart=Session["cart"] as List<Item>; //youll want to check for null etc
//and add another item
Item newItem=new Item();
newItem.Code=productLabel.Text;
newItem.Description=descriptionTextBox.Text;
newItem.Price=priceLabel.Text;
cart.add(newItem);

您的架构存在严重问题。例如,一个有进取心的人可以使用他们的浏览器工具来更改priceLabel.Text中的值,并可能为他们的订单支付更少(或没有!)。但希望这可以让您了解如何继续。

答案 1 :(得分:-1)

public class Item
{
    public string Code {get;set;}
    public string Description {get;set;}
    public string Price {get;set;}
}

你可以创建一种类似内存缓存来存储你的物品:

public static readonly ConcurrentDictionary<string,List<Item>> myMemoryCache = new ConcurrentDictionary<string,List<Item>>();

并将其用作数据源。

您可以对多个条目使用相同的“密钥”,或者将其更改为您喜欢的任何内容。

请务必在App_Start中初始化