Offensichtlich funktioniert der typische WebForms-Ansatz nicht. Wie verfolgt man einen Benutzer in einer MVC-Welt?Was ist das akzeptierte Muster für die Implementierung von Session in ASP.NET MVC-Sites?
Antwort
Die Sitzung funktioniert genauso wie in Webforms. Wenn Sie einfache Informationen speichern möchten, verwenden Sie den Cookie zur Formularauthentifizierung. Wenn Sie einen Inhalt des Einkaufswagens speichern möchten, ist Session der richtige Ort. Ich schrieb einen Blog-Eintrag über using Session with ASP.NET:
Lassen Sie uns sagen, dass wir eine Integer-Variable in Session.We Wrapper erstellen speichern wollen um von Session-Variablen, die es schöner aussehen lässt:
Zuerst definieren wir Schnittstelle:
public interface ISessionWrapper
{
int SomeInteger { get; set; }
}
Dann machen wir Httpcontext Umsetzung:
public class HttpContextSessionWrapper : ISessionWrapper
{
private T GetFromSession<T>(string key)
{
return (T) HttpContext.Current.Session[key];
}
private void SetInSession(string key, object value)
{
HttpContext.Current.Session[key] = value;
}
public int SomeInteger
{
get { return GetFromSession<int>("SomeInteger"); }
set { SetInSession("SomeInteger", value); }
}
}
GetFromSession und SetInSession sind Helfer-Methode, die Einnahme und s machen Daten in Session einfacher anpassen. SomeInteger-Eigenschaft verwendet diese Methoden.
Dann definieren wir unsere Basis-Controller (für ASP.NET MVC):
public class BaseController : Controller
{
public ISessionWrapper SessionWrapper { get; set; }
public BaseController()
{
SessionWrapper = new HttpContextSessionWrapper();
}
}
Wenn Sie Session außerhalb Controller verwenden möchten, die Sie gerade erstellen oder neue HttpContextSessionWrapper() injizieren.
Sie können SessionWrapper durch ISessionWrapper Mock in Controller-Tests ersetzen, so dass es nicht mehr von HttpContext abhängig ist. Die Sitzung ist auch einfacher zu verwenden, weil Sie SessionWrapper.SomeInteger aufrufen, anstatt (int) Session ["SomeInteger"] aufzurufen. Es sieht schöner aus, oder?
Sie könnten versucht sein, eine statische Klasse zu erstellen, die das Session-Objekt abdeckt und in BaseController keine Schnittstellen oder Initialisierungen definieren muss, aber einige Vorteile verliert, insbesondere beim Testen und Ersetzen durch andere Implementierungen . Hier
Warum würden Sie eine Schnittstelle und eine Wrapper-Klasse schreiben, wenn das Framework bereits 'HttpContext.Current.Session [key]'? –
Weil: 1. var cart = (Liste
gute Punkte. Obwohl ich den Downvote nicht zurücknehmen kann, wenn du den Post nicht editiert hast. –
ist ein Code, den ich verwende, nur ein bisschen „verbesserte“ Version der oben Version:
private T GetFromSessionStruct<T>(string key, T defaultValue = default(T)) where T : struct
{
object obj = HttpContext.Current.Session[key];
if (obj == null)
{
return defaultValue;
}
return (T)obj;
}
private T GetFromSession<T>(string key) where T : class
{
object obj = HttpContext.Current.Session[key];
return (T)obj;
}
private T GetFromSessionOrDefault<T>(string key, T defaultValue = null) where T : class
{
object obj = HttpContext.Current.Session[key];
if (obj == null)
{
return defaultValue ?? default(T);
}
return (T)obj;
}
private void SetInSession<T>(string key, T value)
{
if (value == null)
{
HttpContext.Current.Session.Remove(key);
}
else
{
HttpContext.Current.Session[key] = value;
}
}
Wie würden Sie implementieren, können Sie uns einige Beispiele für den obigen Code zeigen –
- 1. Was ist das akzeptierte Muster für WPF, das in MVVM befiehlt?
- 2. Was ist das Muster für die vollständige Eingabe in Logstash?
- 3. Muster für die Implementierung von INotifyPropertyChanged?
- 4. Was ist das asynchrone Muster für asyncwasserfall?
- 5. Was ist das beste C# -Muster für die Implementierung einer Hierarchie mit einer Enumeration?
- 6. Was ist das für ein Muster?
- 7. Implementierung eine Fabrik für das Composite-Muster
- 8. Was ist das akzeptierte Muster für eine Anwendung, die als Dienst oder als Konsolenanwendung ausgeführt werden kann
- 9. Definitive Muster für Templat-datengebundene Steuerelemente in ASP.NET Implementierung
- 10. Was ist das Serialisierungs-Proxy-Muster?
- 11. Was ist die gängige Implementierung für serverseitige XSLT + .Net?
- 12. Ressourcen für die Implementierung von MVVM (ViewModel) -Muster in Flex?
- 13. In C#, was ist die beste/akzeptierte Art der Konstruktorverkettung?
- 14. Große Arrays und LOH-Fragmentierung. Was ist die akzeptierte Konvention?
- 15. Ist das Provider-Muster eine Implementierung von IOC?
- 16. Was ist ein gutes Muster für die Implementierung der Zugriffskontrolle in einem GraphQL-Server?
- 17. Was ist das beste Muster für reaktionsschnelle Anwendungen in famo.us
- 18. Was ist die empfohlene Implementierung für Hash-OLE-Varianten?
- 19. Fehler in NHibernate Session und HttpModule Implementierung
- 20. Was ist die "beste" kanonische Implementierung von Equals() für Referenztypen?
- 21. Was ist der akzeptierte Standard zum Diktieren von Lambda-Ausdrücken?
- 22. Comet-Implementierung für ASP.NET?
- 23. MVVM-Muster für ASP.NET-Webforms?
- 24. Design-Muster für ASP.Net
- 25. Was ist die Roadmap für ASP.NET MVC?
- 26. Was ist das Standardsitzungszeitlimit in ASP.NET?
- 27. ASP.NET Session in Global.asax
- 28. Was ist das Konzept der Speicherung Session-ID in Cookie?
- 29. Was ist "kontinuierliche Implementierung"?
- 30. Was ist die beste Bereitstellungsstrategie für ASP.NET?
interessiert mich das selbst. Ich persönlich möchte einen Brotkrumen-Pfad behalten, aber ich möchte das nicht in der Abfrage-Zeichenfolge weitergeben. Was genau wollten Sie über den Benutzer verfolgen? –
Was ist "der typische WebForms-Ansatz", der nicht funktioniert? –