我需要一些关于会话和如何添加对象的清晰度,因为我认为我做错了。
首先,我创建一个会话来保存产品列表:
Session["ShoppingCart"] = new List<Products>();
要将产品添加到列表中,我确实喜欢这样:
Session["ShoppingCart"] = new Products { ID = productId, Name = name };
我想这不是正确的方法吗?
答案 0 :(得分:4)
我想这不是正确的方法吗?
是的,这不是正确的方法(请跳到我的答案的最后一段,以了解正确的方法 - 根本不使用ASP.NET会话)。正确的方法是首先获取存储在会话中的对象,尝试将其转换为存储在会话中的同一.NET类型:
var products = Session["ShoppingCart"] as List<Products>;
然后如果此项不为null,则将相应的产品添加到列表中。我们当然应该进行必要的类型检查,以确保会话实际包含具有指定键的值,并且该值是预期类型的值:
if (products != null)
{
var product = new Products { ID = productId, Name = name };
products.Add(product);
}
当然我们在这里使用的对象引用只有在你将会话存储在内存中时才会起作用(sessionState mode = InProc),这当然绝对是一场可怕的灾难,你应该永远不会在生产中做些什么。在生产环境中,您可能会在会话服务器甚至SQL服务器中保存会话,不是吗?在这种情况下,使用对象引用是灾难的一种方法显而易见。因此,在这种情况下,一旦将新产品添加到会话中,您当然应该将新列表值设置回会话,该会话将对象实例序列化到相应的数据存储:
if (products != null)
{
var product = new Products { ID = productId, Name = name };
products.Add(product);
Session["ShoppingCart"] = products;
}
现在,在说完所有这些之后我必须承认使用ASP.NET Session可能是你在真实应用程序中犯下的巨大错误。所以基本上每次使用Session["xxx"]
时,你都做错了。只需在整个解决方案中搜索Session
关键字,然后摆脱它。
答案 1 :(得分:0)
为了将itens添加到Session上的现有列表,您必须首先检索列表,然后将对象添加到它。这是一个例子:
Session["ShoppingCart"] = new List<Products>();
List<Products> productsList = (List<Products>)Session["ShoppingCart"];
productsList.add(new Products { ID = productId, Name = name });
Session["ShoppingCart"] = productsList;