2011-12-21 12 views
4

セッションでいくつかのデータを維持する必要があります。 私はそのような多くの特性を書いた:セッションデータを管理するためのより良い方法

public List<string> FillOrder 
{ 
    get { return Session[SessionKeys.QueryFillOrder] as List<string> ?? new List<string>(); } 
    set { Session[SessionKeys.QueryFillOrder] = value; } 
} 

私はそのようなコードを記述する必要があり、このデータを消費する必要がある場合:私はやることを好むので、私にはとても醜いようだ

List<string> fillOrder = FillOrder; 
fillOrder.Add(accordion.ID); 
FillOrder = fillOrder; 

それは

FillOrder.Add(accordion.ID); 

ですが、この方法では私の値はセッションに戻されません。

あなたは同じ結果を達成するためのより良い方法はありますか?

ありがとうございました! ASP.NETのセッションで

public class MySession 
{ 
    // private constructor 
    private MySession() 
    { 
     FillOrder = new List<string>(); 
    } 

    // Gets the current session. 
    public static MySession Current 
    { 
     get 
     { 
     var session = (MySession)HttpContext.Current.Session["__MySession__"]; 
     if (session == null) 
     { 
      session = new MySession(); 
      HttpContext.Current.Session["__MySession__"] = session; 
     } 
     return session; 
     } 
    } 

    // **** add your session properties here, e.g like this: 
    public List<string> FillOrder {get; set; } 
    public string Property1 { get; set; } 
    public DateTime MyDate { get; set; } 
    public int LoginId { get; set; } 
} 

このクラスの店舗自体のインスタンスを1つ、あなたのセッションにアクセスすることができます:

答えて

6

私は常にセッション変数へのアクセスを簡単にするためにASP.NETのセッションの周りにラッパークラスを使用します例えば、このような任意のクラスからタイプセーフな方法でプロパティ、:

MySession.Current.FillOrder.Add(accordion.ID); 

int loginId = MySession.Current.LoginId; 

string property1 = MySession.Current.Property1; 
MySession.Current.Property1 = newValue; 

DateTime myDate = MySession.Current.MyDate; 
MySession.Current.MyDate = DateTime.Now; 

このアプローチにはいくつかの利点があります。

  • コンストラクタでセッション変数を初期化することができます。 new List<string>
  • それはあなたがあなたのセッション項目を文書化することができます
  • 例えばセッション[「ログインID」](あなたはあなたのアプリケーション全体でハードコードされたセッションキーを使用する必要はありませんタイプキャスト
  • の多くからあなたを節約あなたがすることができMySession
+0

ありがとうございました!そして、このアプローチを使用すると、MySession.Current.FillOrder.Add(accordionID)は自動的にSessionに保持されますか?私は後ろの魔法を理解できません! :D – Alessandro

+0

はい!初めてMySession.Currentにアクセスすると、MySessionの新しいインスタンスが作成され、ASP.NETセッションに保存されます。それ以降は、常にそのインスタンスで作業します。ブレークポイントをCurrentプロパティのゲッターに設定して、ブレークポイントの動作を確認します。 – M4N

+0

はい、私は常にそのインスタンスで作業することは明らかです。私が理解できないことは、それがセッションに変更を持続させるところです。 – Alessandro

0

の性質にXMLドキュメントコメントを追加することによって、あなたがいるICollectionかのIListを実装する独自のクラスを書くことができ、そこにあなたがセッションとして追加実装します[...] = ...

1

拡張メソッドも使用しますが、私はM4Nの例がよりよい:

EDITは、それが(で「神」クラスになってリスクけれども、それは@のM4Nにより示唆されるように、すべてのセッション変数のための単一のクラスを使用してジェネリック型

public static class Extensions 
{ 
    public static void AddWithSession<T>(this List<T> list, T value, string key) 
    { 
     list.Add(value); 
     HttpContext.Current.Session[key] = list; 
    } 
} 

str.AddWithSession(accordion.ID,SessionKeys.QueryFillOrder); 
0

は、良いアイデアです作らこの場合、いくつかのクラスに分割することができます)。次のようにあなたは自分の財産の実装を変更することができますしかし

:この例では

public List<string> FillOrder 
{  
    get 
    { 
     List<string> result = Session[SessionKeys.QueryFillOrder] as List<string>; 
     if (result == null) 
     { 
      result = new List<string>(); 
      Session[SessionKeys.QueryFillOrder] = result; 
     } 
     return result; 
    }  
    set { Session[SessionKeys.QueryFillOrder] = value; } 
} 

は、あなたはおそらくセッターを望んでいません。

+0

これは別の方法かもしれませんが、私はM4Nの方法を使用します。 – Alessandro

関連する問題