Ich schreibe eine Webanwendung, mit der ein Benutzer zu mehreren Webseiten innerhalb der Website navigieren kann, um bestimmte Anforderungen zu erfüllen. Alle Informationen, die der Benutzer eingibt, werden in einem von mir erstellten Objekt gespeichert. Das Problem ist, dass auf dieses Objekt von einem beliebigen Teil der Website aus zugegriffen werden muss und ich nicht wirklich weiß, wie dies am besten erreicht werden kann. Ich weiß, dass eine Lösung darin besteht, Sitzungsvariablen zu verwenden, aber ich weiß nicht, wie ich sie in asp .net MVC verwenden soll. Und wo würde ich eine Sitzungsvariable deklarieren? Gibt es einen anderen Weg?
169
Antworten:
Ich würde denken, dass Sie darüber nachdenken möchten, ob die Dinge wirklich in einen Sitzungszustand gehören. Dies ist etwas, was ich hin und wieder mache und es ist eine nette, stark typisierte Herangehensweise an das Ganze, aber Sie sollten vorsichtig sein, wenn Sie Dinge in den Sitzungskontext stellen. Nicht alles sollte da sein, nur weil es einem Benutzer gehört.
In global.asax wird das OnSessionStart-Ereignis verknüpft
Von überall im Code, wo die Eigenschaft HttpContext.Current! = Null ist, können Sie dieses Objekt abrufen. Ich mache das mit einer Erweiterungsmethode.
Auf diese Weise können Sie in Code
quelle
Die Antwort hier ist richtig, ich hatte jedoch Schwierigkeiten, sie in einer ASP.NET MVC 3-App zu implementieren. Ich wollte auf ein Sitzungsobjekt in einem Controller zugreifen und konnte nicht herausfinden, warum ich immer wieder die Meldung "Instanz nicht auf eine Instanz eines Objektfehlers festgelegt" erhielt. Was mir aufgefallen ist, ist, dass in einem Controller, als ich versuchte, wie folgt auf die Sitzung zuzugreifen, dieser Fehler immer wieder auftrat. Dies liegt an der Tatsache, dass this.HttpContext Teil des Controller-Objekts ist.
Was ich jedoch wollte, war der HttpContext, der Teil des System.Web-Namespace ist, da dies der ist, den die obige Antwort in Global.asax.cs vorschlägt. Also musste ich explizit Folgendes tun:
Das hat mir geholfen, ich bin mir nicht sicher, ob ich etwas getan habe, das hier nicht MO ist, aber ich hoffe, es hilft jemandem!
quelle
Da ich "HTTPContext.Current.Session" nicht gerne über den Ort sehe, verwende ich ein Singleton-Muster, um auf Sitzungsvariablen zuzugreifen. Dadurch können Sie leicht auf stark typisierte Datenmengen zugreifen.
dann können Sie von überall auf Ihre Daten zugreifen:
quelle
Wenn Sie asp.net mvc verwenden, haben Sie hier eine einfache Möglichkeit, auf die Sitzung zuzugreifen.
Von einem Controller:
Aus einer Sicht:
Dies ist definitiv nicht der beste Weg, um auf Ihre Sitzungsvariablen zuzugreifen, aber es ist ein direkter Weg. Verwenden Sie es daher mit Vorsicht (vorzugsweise während des Rapid Prototyping) und verwenden Sie einen Wrapper / Container und OnSessionStart, wenn es angebracht ist.
HTH
quelle
Nun, IMHO ..
In Bezug auf # 1 habe ich eine stark typisierte Master-Ansicht, die eine Eigenschaft hat, auf alles zuzugreifen, was das Session-Objekt darstellt. In meinem Fall ist die stark typisierte Master-Ansicht generisch, was mir eine gewisse Flexibilität in Bezug auf stark typisierte Ansichtsseiten gibt
und dann...
quelle
Ich weiß zwar nichts über asp.net mvc, aber das sollten wir auf einer normalen .net-Website tun. Es sollte auch für asp.net mvc funktionieren.
Sie würden dies in eine Methode für den einfachen Zugriff einfügen. HTH
quelle
Es gibt 3 Möglichkeiten, dies zu tun.
Ich bevorzuge den 3. Weg. Dieser Link ist eine gute Referenz.
Abrufen / Festlegen von HttpContext-Sitzungsmethoden in BaseController im Vergleich zum Verspotten von HttpContextBase zum Erstellen von Get / Set-Methoden
quelle
Meine Art, auf Sitzungen zuzugreifen, besteht darin, eine Hilfsklasse zu schreiben, die die verschiedenen Feldnamen und ihre Typen kapselt. Ich hoffe dieses Beispiel hilft:
quelle
Tolle Antworten von den Jungs, aber ich möchte Sie davor warnen, sich immer auf die Sitzung zu verlassen. Dies ist schnell und einfach und würde natürlich funktionieren, wäre aber nicht unter allen Umständen großartig.
Zum Beispiel, wenn Sie auf ein Szenario stoßen, in dem Ihr Hosting die Verwendung von Sitzungen nicht zulässt, oder wenn Sie sich in einer Webfarm befinden oder im Beispiel einer freigegebenen SharePoint-Anwendung.
Wenn Sie eine andere Lösung wünschen, können Sie einen IOC-Container wie Castle Windsor verwenden , eine Provider-Klasse als Wrapper erstellen und dann je nach Ihren Anforderungen eine Instanz Ihrer Klasse unter Verwendung des Lebensstils pro Anforderung oder Sitzung beibehalten.
Das IOC würde sicherstellen, dass jedes Mal dieselbe Instanz zurückgegeben wird.
Komplizierter ja, wenn Sie eine einfache Lösung benötigen, verwenden Sie einfach die Sitzung.
Hier sind einige Implementierungsbeispiele aus Interesse.
Mit dieser Methode können Sie eine Anbieterklasse erstellen, die wie folgt aussieht:
Und registrieren Sie es so etwas wie:
quelle
Sie können ViewModelBase als Basisklasse für alle Modelle verwenden. Diese Klasse kümmert sich um das Abrufen von Daten aus der Sitzung
Sie können eine Erweiterungsmethode in HttpContextBase schreiben, um mit Sitzungsdaten umzugehen
Verwenden Sie dies wie unten in der Steuerung
Das zweite Argument ist optional. Es wird verwendet, um Sitzungsdaten für diesen Schlüssel zu füllen, wenn in der Sitzung kein Wert vorhanden ist.
quelle