5 Stimmen

ASP.NET MVC: Bewährte Praktiken für die Speicherung des Sitzungsstatus in einer assistentenähnlichen Anwendung

Angenommen, ich habe eine Webanwendung, die wie eine Reihe von Assistentenseiten zur Bearbeitung eines komplexen Objekts implementiert ist. Bis der Benutzer auf die Schaltfläche "Fertigstellen" klickt, wird das Objekt nicht im Backend-System gespeichert (eine Anforderung), so dass ich in der Zwischenzeit die gesamten Informationen über das Objekt in einer Art Sitzungszustand halten muss.

Außerdem müssen einige der Assistentenseiten Kombinations- und Listenfelder mit einer potenziell großen Anzahl von Elementen anzeigen. Diese Elemente werden mithilfe eines Webdienstes aus dem Backend-System abgerufen.

Zufälligerweise erlaubt der Assistent dem Benutzer, von einer Seite des Assistenten zu einer anderen zu springen (mit Hilfe von Registerkarten am oberen Rand des Formulars), es ist also kein einfaches "weiter, weiter... fertig".

Zusätzliche Einschränkung: Die Webanwendung läuft auf einer Webfarm und der Kunde ist der Verwendung eines serverseitigen Sitzungsstatus überdrüssig. Im besten Fall soll die Größe des Sitzungsstatus minimal gehalten werden (in der Vergangenheit gab es damit Probleme).

Im Grunde gibt es hier also zwei Probleme:

  1. Wie/wo sollen die vom Benutzer im Assistenten eingegebenen Daten gespeichert werden?
  2. Sollen die vom Backend empfangenen Kombinations-/Listenelemente zwischengespeichert werden und wenn ja, wo?

Optionen, die ich in Betracht ziehe:

  1. Speichern des Objekts in einer WebForms-ähnlichen AnsichtZustand (durch Serialisierung in die HTML-Seite). Dies würde auch die Elemente der Kombinationsfelder einschließen. Natürlich könnte es ein Problem geben, wenn die HTML-Seiten sehr groß werden und die Webanwendung dadurch langsam wird.

  2. Die Speicherung in Server-seitiger Sitzungsstatus ohne Rücksicht auf die Wünsche des Kunden und ohne zu wissen, wie die Leistung beeinflusst wird, bis sie auf der tatsächlichen Webfarm getestet wird (spät im Projekt).

Ich kann mich nicht zwischen diesen beiden entscheiden. Oder gibt es eine andere Alternative?

2 Stimmen

Wenn Sie den Weg über den Sitzungsstatus gehen, erstellen Sie einen benutzerdefinierten Modellbinder und lassen Sie das Objekt an die Aktionsmethoden des Controllers übergeben.

0 Stimmen

Das ist es, womit ich jetzt spiele. In der Tat denke ich über die Verwendung des gleichen Modells als die Ansicht Modell und dann serialisieren Sie es in der Ansicht-Code. Und dann deserialize es zurück mit einem Modell Binder. Macht das Sinn?

0voto

MikeD Punkte 913

Ich habe mit dem gleichen Problem zu tun, und während meine Anforderungen sind ein wenig einfacher (halten Zustand für nur ein paar Zeichenfolgen), kann meine Lösung für Sie arbeiten. Ich würde auch daran interessiert sein, andere Gedanken zu diesem Ansatz zu hören.

Was ich am Ende zu tun ist: in den Controller ich gerade Dump die Daten, die ich in die Session-Eigenschaft des Controllers wollen und dann ziehen Sie es das nächste Mal, wenn ich es brauche. Etwas wie dieses für Ihre Situation:

//Here's the controller
public Controller PersonCreator  
{  
    public ActionResult CreatePerson()  
    {    
        //get the age out of the session
        int age = (int)(Session["age"]);
        //do something with it...
        return View();  
    }  
    public ActionResult SetPersonAge(Person person)  
    {  
        //put the age in the session
        Session.Add("age", person.Age);
        return View(person);  
    }
}

Was mir daran gefällt, ist, dass ich nicht eine Menge versteckter Parameter auf meinen Ansichtsseiten einfügen muss.

0 Stimmen

Während das in der Tat funktioniert, offensichtlich ist es ein Beispiel, das muss am Ende mit abstrakten Klasse / Schnittstelle / global.asax / Fehlerbehandlung / beste Muster & Praktiken.... Aber ja, das funktioniert.

0voto

Dominic Zukiewicz Punkte 8000

Die Antwort auf diese Frage findet sich in ASP.NET MVC 2/3 von Steve Sanderson und erfordert einen Verweis auf die MVC Futures Assembly. Dieser Link zu Google Bücher ist genau das, was er tut.

Im Wesentlichen serialisieren Sie die Daten des Assistenten in der Ansicht. Es wird ein verborgenes Feld gerendert, in dem alle erfassten Informationen gespeichert werden.

Ihr Controller kann durch die Verwendung der OnActionExecuting y OnResultExecuted (zur Berücksichtigung von Weiterleitungen), um sie an die nächste Ansicht weiterzuleiten.

Lesen Sie ihn - er erklärt es viel gründlicher, als ich es kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X