在Sessions中存储自定义对象

时间:2011-04-13 04:11:14

标签: c# asp.net session

在会话中存储自定义对象的一般方法是什么。 我打算在整个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会话呢?我在哪里宣布?

我希望每个用户会话都存储在一个唯一的会话中。因此,在访客会话和成员会话之间没有任何混合。

3 个答案:

答案 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. 每当Web应用程序或Web服务器回收/重新启动时,您的进程内会话都将丢失。这意味着您需要在适当的时间点在数据库中保存会话。
  2. 您可以使用进程外会话存储(数据库或不同服务器) - 在这种情况下,您必须将购物车类标记为可序列化。进程外会话有性能成本。因此,您已经在数据库中存储会话,所以IMO,您应该使用进程内会话,确保尽快将脏会话写入数据库。

答案 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");