セッションにカスタムオブジェクトを格納する一般的な方法。私はカートを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"]を書く必要がありますか。これを行う簡単な方法はありませんか?ゲストカートセッションについてはどうですか?どこで宣言しますか?
各ユーザーセッションを一意のセッションに保存する必要があります。そのため、ゲストセッションとメンバーセッションの間に問題が発生することはありません。
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
}
ここで考慮すべきことはほとんどありません。
マスターページに追加するか、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;
}
}
静的クラスの汎用拡張メソッド定義:
public static T GetSession<T>(string key) => HttpContext.Current?.Session?[key] != null ? (T)HttpContext.Current.Session[key] : default(T);
暗黙的な使用例
var myCart = GetSession<ShoppingCart>("myKey");
推論
ShoppingCart myCart2 = GetSession("myKey");
存在するかどうかを確認する
if(myCart != default(ShoppingCart)){
// do stuff
}