質問

実行する代わりに

 session("myvar1") = something
 session("myvar2") = something
 session("myvar3") = something
 session("myvar4") = something

やっています

enum sessionVar
   myvar1
   myvar2
   myvar3
   myvar4
end enum


 session(sessionVar.myvar1.tostring) = something
 session(sessionVar.myvar2.tostring) = something
 session(sessionVar.myvar3.tostring) = something
 session(sessionVar.myvar4.tostring) = something

より良いでしょうか

役に立ちましたか?

解決

セッションキーに定数を使用する代わりに、このように見える独自のタイプセーフセッションオブジェクトを使用しています(これはC#にあります。VBバージョンについては以下を参照してください):

public class MySession
{
  // Private constructor (use MySession.Current to access the current instance).
  private MySession() {}

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

  // My session data goes here:
  public string MyString { get; set; };
  public bool MyFlag { get; set; };
  public int MyNumber { get; set; };
}

セッションとの間で何かを読み書きする必要があるときはいつでも、次のようにタイプセーフセッションオブジェクトを使用できます。

string s = MySession.Current.MyString;
s = "new value";
MySession.Current.MyString = s;

このソリューションにはいくつかの利点があります:

  • タイプセーフなセッションがあります(タイプキャストはありません)
  • すべてのセッションベースのデータを文書化できます(MySessionのパブリックプロパティにコメントすることにより)
  • 新しい要素をセッションに追加するとき、同じセッションキーが別の場所で既に使用されているかどうかを確認するためにソリューションを検索する必要はありません。

更新: これはVBバージョンです(C#バージョンから自動的に変換されます)。申し訳ありませんが、VBを知らないため、VBでプロパティを記述する方法を知りませんでした。

Public Class MySession
    ' Private constructor (use MySession.Current to access the current instance).
    Private Sub New()
    End Sub

    ' Gets the current session.
    Public Shared ReadOnly Property Current() As MySession
        Get
            Dim session As MySession = TryCast(HttpContext.Current.Session("__MySession__"), MySession)
            If session = Nothing Then
                session = New MySession()
                HttpContext.Current.Session("__MySession__") = session
            End If
            Return session
        End Get
    End Property

    ' My session data goes here:
    Public MyString As String
    Public MyFlag As Boolean
    Public MyNumber As Integer
End Class

他のヒント

これらの値が関連している場合のみ。それ以外の場合は、プレーンな古い定数を使用します。

方法:-

public static class  SessionVar
{
  public static readonly string myVar1 = "myVar1";
  public static readonly string myVar2 = "myVar2";
  public static readonly string myVar3 = "myVar3";
  public static readonly string myVar4 = "myVar4";
}

これにより、以下を使用できます。-

session(SessionVar.myVar1) = something;

このようなクラスを使用して、型付きセッション/キャッシュラッパーを作成しました。追加のコードをget / setに追加する必要があるかもしれませんが、それはあなたにお任せします。

internal class SessionHelper
{
    private const string  myVar1Key = "myvar1";

    public static int MyVar1
    {
        get
        {
            return (int)System.Web.HttpContext.Current.Session[myVar1Key];
        }
        set
        {
            System.Web.HttpContext.Current.Session[myVar1Key] = value;
        }
    }
}

C#についてごめんなさい...

すべての文字列キー参照を削除する簡単なことのために、アプリケーションスコープで表示されるグローバルな静的/共有定数を使用します。

それ以外の場合、セッション変数の強く型付けされた単純なラッパーは優れた代替手段であり、インテリセンスとオブジェクトブラウザーの互換性が得られることを考えると、はるかにOOPフレンドリーです。

enumが非常に価値があることを確認できる唯一の方法は、配列または同様のリストにインデックスを付けるために使用することです。ただし、その場合でも、enumをintにキャストする必要があります。

したがって、すべてのセッション変数キーを使用してアプリケーションの起動時にロードする配列を作成し、次にインデックスの列挙を作成できます。ただし、SessionオブジェクトがIEnumerableから派生するHttpSessionStateから派生する場合は、必要に応じて、セッション変数に対してforeachループを実行することができます。

この質問は少し前に尋ねられ、<!> quot; answer <!> quot;すでに選ばれています。しかし、私はちょうどそれに出くわしました。マーティンの答えは良いです。ただし、将来この問題に遭遇した人を支援するために、セッションをうまく処理する方法が本当に必要な場合は、この投稿。簡単なことはないと思います。

セッション変数の構造をそのまま保持することで、投稿された他のソリューションの特定の欠点を回避するソリューションを思い付きました。これは、セッション変数を取得および設定するためのタイプセーフなショートカットです。

C#ですが、最後に自動生成されたVB.NETを投稿しました。

私が見た最良の解決策(受け入れられた答えとTheObjectGuyによるもの)は、Session変数に格納されたカスタムクラスを必要とし、その後、セッションからプルされてMySessionClass.Current.MyPropertyなどのプロパティにアクセスします。

これに関する問題は、現在使用している(または将来使用する可能性がある)場合、InProc Session-Stateモード以外のものを使用することです( https://msdn.microsoft.com/en-us/library/ms178586%28v=vs.140%29.aspx )、クラス全体が1つのプロパティにアクセスするにはシリアル化を行う必要があります。

また、実際のセッションが提供するIEnumerableおよびICollectionの実装が必要な場合、それらを失うことを意味します。私のソリューションでは、この機能が必要な場合は、実際のセッションに簡単にアクセスできます。

これらのセッション変数は簡単に使用でき、タイプセーフです。 Session [<!> quot; MyProperty <!> quot;]のようなステートメントと一緒に使用できます。これにより、既存のプロジェクトを一度に1参照ずつ変換できます。だから:

int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;

なる:

int myInt = SessionVars.MyInt; 
SessionVars.MyInt = 3;

実際のクラスは次のとおりです。 CallerMemberNameには.NET 4.5が必要ですが、古いバージョンを使用している場合でも、propertyNameを明示的に渡すことで管理できます。また、プロパティのタイプは、標準のSession [<!> quot; MyProp <!> quot;]呼び出しとまったく同じように動作するようにnull可能でなければなりません。これは、設定されていない

public static class SessionVars
{
    private static T Get2<T>([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") 
    {
        if (HttpContext.Current.Session[propertyName] == null)
        {
            return default(T);
        }

        return (T)HttpContext.Current.Session[propertyName];
    }

    private static void Set2<T>(T value, [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        HttpContext.Current.Session[propertyName] = value;
    }

    public static int MyInt { get { return Get2<int>(); } set { Set2<int>(value); } }
    public static bool MyBool { get { return Get2<bool>(); } set { Set2<bool>(value); } }
    public static string MyString { get { return Get2<string>(); } set { Set2<string>(value); } }
}

これらのプロパティの追加を容易にするためにコードスニペットを作成しました:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <Header>
    <Title>SessionVars Property</Title>
    <Author>kevinpo</Author>
    <Shortcut>sv</Shortcut>
    <Description>Adds a property for use in a SessionVars class</Description>
    <SnippetTypes>
      <SnippetType>Expansion</SnippetType>
    </SnippetTypes>
  </Header>
  <Snippet>
    <Declarations>
      <Literal>
        <ID>type</ID>
        <Default>int</Default>
      </Literal>
      <Literal>
        <ID>property</ID>
        <Default>PropertyName</Default>
      </Literal>
    </Declarations>
    <Code Language="CSharp">
      <![CDATA[public static $type$ $property$ { get { return Get2<$type$>(); } set { Set2<$type$>(value); } }]]>
    </Code>
  </Snippet>
</CodeSnippet>

私はC#であるため、このVB.NETは http://converter.telerikによって自動変換されるだけです。 .com /

Public NotInheritable Class SessionVars
    Private Sub New()
    End Sub
    Private Shared Function Get2(Of T)(<System.Runtime.CompilerServices.CallerMemberName> Optional propertyName As String = "") As T
        If HttpContext.Current.Session(propertyName) Is Nothing Then
            Return Nothing
        End If
        Return DirectCast(HttpContext.Current.Session(propertyName), T)
    End Function

    Private Shared Sub Set2(Of T)(value As T, <System.Runtime.CompilerServices.CallerMemberName> Optional propertyName As String = "")
        HttpContext.Current.Session(propertyName) = value
    End Sub

    Public Shared Property MyInt() As Integer
        Get
            Return Get2(Of Integer)()
        End Get
        Set
            Set2(Of Integer)(value)
        End Set
    End Property
    Public Shared Property MyBool() As Boolean
        Get
            Return Get2(Of Boolean)()
        End Get
        Set
            Set2(Of Boolean)(value)
        End Set
    End Property
    Public Shared Property MyString() As String
        Get
            Return Get2(Of String)()
        End Get
        Set
            Set2(Of String)(value)
        End Set
    End Property
End Class

'=======================================================
'Service provided by Telerik (www.telerik.com)
'Conversion powered by NRefactory.
'Twitter: @telerik
'Facebook: facebook.com/telerik
'=======================================================
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top