在会话中存储自定义对象的一般方法是什么。 我打算在整个Web应用程序中保持我的购物车会话。当该用户注销时,会话将被清除。
Class ShoppingCart {
private List<CartItem> Items = new List<CartItem>();
public ShoppingCart()
{
this.Items = new List<CartItem>();
if (HttpCurrent.Current["Cart"]!=null])
{
this.Items = ShoppingCart.loadCart(HttpCurrent.Current["User"]);
}
}
}
当用户登录时,我将购物车放入会话中 像
Session["Cart"] = new ShoppingCart();
但我是否必须在每一页上编写Session [“Cart”]。有没有更简单的方法来做到这一点?还有Guest cart会话呢?我在哪里宣布?
我希望每个用户会话都存储在一个唯一的会话中。因此,在访客会话和成员会话之间没有任何混合。
答案 0 :(得分:39)
ASP.NET会话对应于浏览器会话 - 它与用户是否经过身份验证(已登录)无关。所以你不应该对客人/会员会议有任何问题。我建议你通过静态访问器属性公开当前的购物车 - 例如
Class ShoppingCart {
public static ShoppingCart Current
{
get
{
var cart = HttpContext.Current.Session["Cart"] as ShoppingCart;
if (null == cart)
{
cart = new ShoppingCart();
HttpContext.Current.Session["Cart"] = cart;
}
return cart;
}
}
... // rest of the code
}
这里要考虑的事情很少:
答案 1 :(得分:4)
将其添加到母版页,或者您可以向ShoppingCart对象添加静态属性
public static ShoppingCart GetCurrent
{
get
{
if(HTTPContext.Current.Session["CurrentCart"] == null)
{
HTTPContext.Current.Session["CurrentCart"] = new ShoppingCart();
}
return HTTPContext.Current.Session["CurrentCart"] as ShoppingCart;
}
}
答案 2 :(得分:0)
静态类中的通用扩展方法定义:
id model vtype
1 1 2
2 4 6
2 5 7
用法示例 隐式
vehicle dates department quantity totalcost model vtype
1 2019-01-01 102 12 1200 1 2
1 2019-01-05 102 15 1500 1 2
1 2019-01-13 102 18 1800 1 2
1 2019-01-22 102 10 1000 1 2
1 2019-01-18 102 10 1000 1 2
1 65 6500
2 2019-01-01 102 12 1260 5 7
2 2019-01-05 102 19 1995 5 7
2 2019-01-13 102 28 2940 5 7
1 45 6195
推断
public static T GetSession<T>(string key) => HttpContext.Current?.Session?[key] != null ? (T)HttpContext.Current.Session[key] : default(T);
检查是否存在
var myCart = GetSession<ShoppingCart>("myKey");