2009-04-17 20 views
21

Ich möchte ein Objekt in verschiedenen Schritten in einer asp.net MVC-Anwendung erstellen, jeder Schritt ist eine andere Seite. Die Art von Dingen, die Sie in einer schnellen Web.Forms-Anwendung in Session speichern würden.Asp.Net MVC und Sitzung

Lesen Sie darüber, Sitzung scheint mir nicht als etwas sehr asp.net MVC'ish. Allerdings kann ich mir keine andere Alternative zu dieser Situation vorstellen, da TempData und ViewData ebenfalls nicht passen, also liege ich vielleicht falsch.

Natürlich könnte ich die 4 Schritte auf einer Seite und zeigen/verstecken, aber das ist nicht mein Punkt mit der Frage. Ich würde gerne Ihre Meinung zu Session in MVC hören, wenn es ein guter Ansatz für diese Art von mehrstufigem Problem ist oder Sie es auf andere Weise tun.

Das ist sehr ähnlich wie Frage Session variables in ASP.NET MVC, außer dass ich nicht nach dem Zugriff auf Session suchen, aber wenn es der beste Weg ist, um ein solches Problem zu lösen, oder es gibt etwas Besseres fehlt mir in Asp.Net MVC .

Vielen Dank im Voraus

Antwort

20

Es gibt nichts Un-MVC über Session, es ist ein wichtiger Teil des Webs und die meisten Websites verwenden es in irgendeiner Weise. Sie haben wirklich zwei Hauptoptionen. Speichern Sie das Objekt in der Datenbank zwischen den Seiten (was bedeutet, dass ein unvollständiges Objekt gespeichert wird), oder speichern Sie es in der Sitzung. Beide haben Vor- und Nachteile.

In der Sitzung müssen Sie kein Teilobjekt in der Datenbank speichern, aber wenn der Benutzer die Sitzung verlässt oder die Zeit abgelaufen ist, verlieren Sie alle diese Informationen. Es kann auch zu einem größeren Speicherbedarf pro Benutzer führen, und wenn Sie es skalieren, verursacht das einige andere Probleme. (All dies kann mithilfe von sticky-session in einem Load Balancer oder einem zentralen Sitzungsspeicher gelöst werden).

Der Datenbankweg ist in vielerlei Hinsicht besser, aber normalerweise möchten Sie unvollständiges Objekt nicht in der Datenbank speichern, ein Kompromiss besteht darin, eine andere Tabelle zu erstellen und das serialisierte Objekt in dieser Tabelle zu speichern. Es geht nicht durch Ihre realen Tabellen und Sie müssen keine Kompromisse bei den Datenbankeinschränkungen eingehen. (Sie können auch Sitzungsdaten in der Datenbank speichern, die im Grunde dasselbe tut)

Am Ende ist es ein Urteilsspruch zwischen den beiden Möglichkeiten, die ich beide im Laufe der Jahre verwendet habe.

+0

Ich stimme dir nicht zu, aber sei dir bewusst, dass die sticky-Sitzung oder der zentrale Sitzungszustand schlechte Nachrichten für die Skalierbarkeit sind. Es ist natürlich immer noch möglich zu skalieren, aber es macht das Leben schwer. Wenn der Sitzungsstatus vermieden werden kann, ist die Skalierbarkeitsgeschichte viel schöner - vielleicht ist das der Grund, warum das OP sich davor hütet? –

+4

Wie definieren Sie hart? Ich habe eine Anzahl von Systemen mit dieser Methode skaliert und bin nicht auf Probleme gestoßen. Es ist sehr schwierig, die Sitzung vollständig zu umgehen, vor allem, wenn Sie sich in Benutzer einloggen, usw. –

1

Haben Sie <%= Html.HiddenField(...) %> versucht?

+0

Meinst du den HTML-Helfer für ""? Mit diesem konnte ich nur einfache Werte speichern, ich muss ein komplexes Objekt speichern und füllen – antonioh

+0

http://stackoverflow.com/questions/669492/asp-net-mvc-is-there-a-way-to-simulate-a -viewstate/669495 # 669495 –

+0

Danke, aber das ist nicht wirklich, was ich gesucht habe. Ich bin auf der Suche nach bewährten Standards. Es ist jedoch eine gute Idee. – antonioh

2

Sie können es zwischen Ansichten mit TempData übergeben ... aber Sie müssen beibehalten, indem Sie es durch nachfolgende Ansichten übergeben. Es ist beabsichtigt, durch nachfolgende Anforderung konsumiert zu werden, aber das heißt nicht, dass Sie temporäre Daten nicht an die nächste Anforderung übergeben können, die dieselben Daten auch wieder in temporäre Daten zurücklegt.