如何在ASP .Net中处理多个会话变量?

时间:2014-05-31 17:08:15

标签: asp.net session cart

作为在线购物的一部分,我使用Session实现了购物车。 我已按以下方式实施了购物车:

Session[pname] = qty;

其中pname是一个字符串变量,它保存产品的名称,我用它作为密钥。 qty是一个整数变量,用于保存该特定产品的项目数。 为了显示购物车项目,我只使用了以下循环:

foreach(string keys in Session.Keys)

通过这个我得到产品的名称和相关的数量,并使用它我显示购物车项目。当我在同一页面上激活用户的会话时,就会出现问题。

Session["uname"] = user_name;

在使用Session.Keys检索密钥时,uname包含了我不想要的内容,因为我只需要产品的名称。有没有办法在没有阅读Session[pname]的情况下从Session["uname"]读取密钥?

2 个答案:

答案 0 :(得分:0)

不是在每个产品和数量的会话中存储对象,而是存储包含所有购物车项目的单个对象(例如List)。

以下是一个可以调整以满足您需求的示例:

首先,一个存储数据的简单对象:

public class CartItem {
    public string Name { get; set; }
    public int Quantity { get; set; }
}

然后,如果您需要将对象添加到购物车列表:

var cartItems = new List<CartItem>();

cartItems.Add(new CartItem() {
    Name = "",
    Quantity = 1
});

Session["Cart"] = cartItems;

//Need to fetch the cart items later on?
cartItems = (List<CartItem>)Session["Cart"];

显然,这可以用不同的方式实现,这只是一个简单的例子。

答案 1 :(得分:0)

你提到需要一个比Justin Helgerson所说的更容易修复,所以这里有一些建议,但他们觉得有点快速和肮脏。贾斯汀可能是最好的解决方案。我使用了一个快速的控制台应用程序来演示这一点,所以将常量放在它们所属的位置,显然你不必创建一个字典。

const string USERSESSION = "uname";
Dictionary<string, object> session = new Dictionary<string, object>();
session["item1"] = 2;
session["item2"] = 1;
session[USERSESSION] = "StackOverflowUser";

// print cart items - minus the user name session key
foreach (string key in session.Keys.Where(s => s != USERSESSION))
{
    Console.WriteLine("Key: {0} Value: {1}", key, session[key]);
}

或者,如果您计划的密钥多于"uname",请使用Linq Except方法。

// build up except set
List<string> exceptKeys = new List<string>
{
    USERSESSION
};

foreach (string key in session.Keys.Except(exceptKeys))
{
    Console.WriteLine("Key: {0} Value: {1}", key, session[key]);
}