Frage

anstatt das zu tun

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

macht

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

wäre besser?

War es hilfreich?

Lösung

Stattdessen Konstanten für die Sitzungsschlüssel zu verwenden, ich bin mein eigenes typsichere Session-Objekt verwenden, die wie folgt aussieht (sorry dies in C #, siehe unten für eine VB-Version):

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; };
}

Jedes Mal, wenn ich brauche etwas zu lesen / schreiben zu / von der Sitzung, kann ich meine typsichere Session-Objekt wie folgt verwenden:

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

Diese Lösung ergibt mehrere Vorteile:

  • Ich habe eine typsichere Session (nicht mehr Typ-Casts)
  • Ich kann alle Session-basierte Daten dokumentieren (durch die öffentlichen Eigenschaften in MySession Kommentierung)
  • Wenn ein neues Element in die Sitzung hinzugefügt, muß ich die Lösung nicht suchen, um zu überprüfen, ob der gleiche Session-Schlüssel bereits woanders verwendet wurde.

Update: Hier ist eine VB-Version (automatisch von der C # Version konvertiert). Sorry, aber ich weiß, VB nicht und so wusste ich nicht, wie Sie die Eigenschaften in VB schreiben:

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

Andere Tipps

Nur wenn diese Werte in Beziehung stehen. Ansonsten nur alte Konstanten verwenden.

Wie etwa: -

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";
}

Auf diese Weise können Sie verwenden: -

session(SessionVar.myVar1) = something;

Ich habe Klassen wie diese verwendet, um einen typisierte Session / Cache-Wrapper zu machen. Möglicherweise müssen Sie zusätzlichen Code zum get / set hinzuzufügen, aber das werde ich dir überlassen.

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;
        }
    }
}

Sorry über die C # ....

Für die einfache Sache aller der String-Schlüssel Referenzen zu entfernen, würde ich mit der globalen statischen / shared Konstanten sichtbar Anwendungsbereich gehen.

Ansonsten ist die stark typisierten einfacher Wrapper für Session-Variablen ist eine bessere Alternative, und es ist weit mehr OOP freundlich bedenkt, dass Sie Intellisense und Objekt-Browser-Kompatibilität erhalten.

Die einzige Art, wie ich die Enum Wesen viel Wert sehen kann, ist in einem Array oder einer ähnlichen Liste Index verwendet werden. Aber auch dann müssen Sie die Enum in einen int werfen.

So könnte man einen Array hat, die Sie beim Start der Anwendung geladen werden mit allen Ihren Session-Variablen Schlüssel und dann einer Enumeration für die Indizes. Angesichts der Tatsache, dass das Session-Objekt von Httpsessionstate leitet, die von IEnumerable ableitet, sollten Sie in der Lage sein, nur eine foreach Schleife über die Session-Variablen zu tun, wenn Sie müssen.

Ich weiß, diese Frage gestellt wurde vor einer Weile und eine „Antwort“ ist bereits ausgewählt worden. Aber ich kam gerade über sie. Martin Antwort ist gut. Jedoch unterstützen alle, die über das in Zukunft stolpert, wenn man wirklich eine glatte Art und Weise zu behandeln Session wollen, lesen Sie post . Ich glaube nicht, dass Sie etwas einfacher finden.

kam ich mit einer Lösung, die, indem sie die Struktur der Session-Variablen intakt geschrieben gewisse Nachteile der anderen Lösungen vermeidet. Es ist einfach eine typsichere Verknüpfung zu bekommen und Session-Variablen festgelegt.

Es ist C #, aber ich geschrieben einig automatisch generierte VB.NET am Ende.

Die besten Lösungen I (die akzeptierte Antwort, und den von TheObjectGuy) gesehen haben, benötigen Sie eine benutzerdefinierte Klasse, die in einer Session-Variablen gespeichert wird, und dann von der Session gezogen wird, dessen Eigenschaften mit etwas zuzugreifen wie MySessionClass.Current.MyProperty .

Das Problem dabei ist, dass, wenn Sie gerade verwenden (oder in der Zukunft verwenden) etwas anderes als ein InProc Session-State-Modus (siehe https://msdn.microsoft.com/en-us/library/ms178586%28v=vs.140%29.aspx ), würde die ganze Klasse geht durch Serialisierung hat eine einzelne Eigenschaft zugreifen zu können.

Das bedeutet auch, dass Sie die IEnumerable und ICollection Implementierungen durch die tatsächliche Session angeboten verlieren, wenn Sie diejenigen brauchen. Mit meiner Lösung, können Sie einfach die aktuelle Session zugreifen, wenn Sie diese Funktion benötigen.

Sie können ganz einfach diese Session-Variablen verwenden und sie sind typsicher. Es kann neben Aussagen wie Session [ „MyProperty“] verwendet werden, die für die Umwandlung einer bestehenden Projekt einer Referenz zu einem Zeitpunkt ermöglicht. Also:

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

wird:

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

Hier ist die eigentliche Klasse. Die CallerMemberName erfordert .NET 4.5, aber auch wenn Sie eine ältere Version verwenden können Sie es immer noch verwalten, indem explizit den Eigenschaftsnamen übergeben. Außerdem müssen die Typen der Eigenschaften sein NULL festlegbare, um es genau die gleichen wie Standard-Session zu machen handeln [ „MyProp“] nennt, weil ein nicht-Set

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); } }
}

Ich schrieb sogar einen Code-Schnipsel, diese Eigenschaften zu erleichtern und fügt hinzu:

<?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>

Ich bin ein C # Kerl, so dass diese VB.NET ist nur Auto-konvertiert von 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
'=======================================================
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top