作为在线购物的一部分,我使用Session实现了购物车。 我已按以下方式实施了购物车:
Session[pname] = qty;
其中pname
是一个字符串变量,它保存产品的名称,我用它作为密钥。 qty
是一个整数变量,用于保存该特定产品的项目数。
为了显示购物车项目,我只使用了以下循环:
foreach(string keys in Session.Keys)
通过这个我得到产品的名称和相关的数量,并使用它我显示购物车项目。当我在同一页面上激活用户的会话时,就会出现问题。
Session["uname"] = user_name;
在使用Session.Keys检索密钥时,uname
包含了我不想要的内容,因为我只需要产品的名称。有没有办法在没有阅读Session[pname]
的情况下从Session["uname"]
读取密钥?
答案 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]);
}