ASP.NET MVC - TempData - Gute oder schlechte Praxis

96

Ich verwende die AcceptVerbsin Scott Gu's Preview 5-Blogbeitrag beschriebene Methode für den Umgang mit Formulareinträgen in ASP.NET MVC:

  • Der Benutzer erhält über GET ein leeres Formular
  • Der Benutzer sendet das ausgefüllte Formular per POST an dieselbe Aktion
  • Die Aktion überprüft Daten, ergreift die entsprechenden Maßnahmen und leitet zu einer neuen Ansicht weiter

Also muss ich nicht benutzen TempData. Das heißt, ich muss jetzt einen "Bestätigungs" -Schritt zu diesem Prozess hinzufügen, und es scheint die Verwendung von zu erfordern TempData.

Aus irgendeinem Grund habe ich eine Abneigung gegen die Verwendung TempData- dass es etwas ist, um das herum entworfen werden muss.

Ist das überhaupt ein berechtigtes Anliegen oder mache ich es wieder gut?

anonym
quelle
1
Machen Sie aus Ihrem Bestätigungsschritt einen Javascript-Dialog. Weniger Server-Roundtrips und Sie werden nicht auf dieses Problem stoßen.
Ajma

Antworten:

26

Ich stelle mir temporäre Daten als einen Feuer-und-Vergessen-Mechanismus zur Benachrichtigung des Benutzers vor. Es ist großartig, sie an etwas zu erinnern, das sie kürzlich getan haben, aber ich würde auch zögern, es zu einem erforderlichen Schritt in einem Benutzerprozess zu machen. Der Grund dafür ist, dass die Seite, wenn sie aktualisiert wird, meiner Meinung nach nicht mehr vorhanden ist. Nun, ich denke, ich zögere auch, es zu verwenden, da es nicht wirklich genau definiert ist, wie zuverlässig es ist.

Ich frage mich, ob das Problem darin besteht, dass die Aktion vor dem Bestätigungsschritt auf eine andere Seite umgeleitet wird. Ich frage mich, ob Sie stattdessen nach dem ersten Senden genügend Verarbeitung durchführen könnten, um den Bestätigungsdialog zu generieren, und dann die Originalseite mit der Bestätigungsfrage zurückgeben könnten. Ähnlich wie bei der Validierung, außer dass die Validierungsregel prüft, ob der Bestätigungsschritt ausgeführt wurde (wobei die Bestätigungs-Benutzeroberfläche ausgeblendet ist, bis eine andere Validierung erfolgreich ist).

Frank Schwieterman
quelle
77

Keine Abneigung gegen TempData erforderlich ... Aber wenn es nicht richtig verwendet wird, könnte dies sicherlich ein Hinweis auf ein schlechtes Design sein. Wenn Sie RESTful-URLs verwenden, ist TempData eine bewährte Methode zum Übertragen von Nachrichten von Ihren POST-Aktionen zu Ihren GET-Aktionen. Bedenken Sie:

Sie haben ein Formular unter URL Products / New. Das Formular Posts to Products / Create, das das Formular validiert und das Produkt erstellt. Bei Erfolg leitet der Controller zu URL Products / 1 weiter und bei einem Fehler wird er zurück zu products / New umgeleitet, um Fehlermeldungen anzuzeigen.

Products / 1 ist nur die Standard-GET-Aktion für das Produkt. Wir möchten jedoch, dass eine Meldung angezeigt wird, dass die Einfügung erfolgreich war. TempData ist dafür perfekt. Fügen Sie die Nachricht zu TempData im Post Controller hinzu und fügen Sie eine if-Logik in die Ansicht ein, und fertig.

Bei einem Fehler habe ich die in formCollection eingegebenen Werte und eine Sammlung von Fehlermeldungen zu TempData in der Post-Aktion hinzugefügt und zu den ersten Aktionsprodcuts / New umgeleitet. Ich habe der Ansicht Logik hinzugefügt, um die Formulareingaben mit den zuvor eingegebenen Werten zusammen mit etwaigen Fehlermeldungen zu füllen. Scheint mir nett und sauber zu sein!

JasonD
quelle
Warum diese zusätzliche Arbeit erledigen, wenn Sie direkt zurück posten können Products/New? Welchen Wert bringt es Products/Create?
Mpen
2
@Mark verhindert mit Products / Create, dass der Benutzer die Aktion per Postback abschließt und bei einer späteren Aktualisierung (oder einem Lesezeichen und einer Rückgabe) die Aktion versehentlich erneut ausführt. Weitere
Informationen finden
2
@ehdv: Aber wirklich? Bei Erfolg wird auf eine andere Seite weitergeleitet. Bei Misserfolg sollten die Formularfehler angezeigt werden, und es sollten keine Maßnahmen ergriffen werden, damit kein Schaden angerichtet wird. Es würde nur verhindern, dass die nervige Nachricht "Sind Sie sicher, dass Sie erneut posten möchten", die ich oft möchte. Ich denke, es hängt von Ihrem Design ab, damit ich Ihren Standpunkt sehen kann.
Mpen
31

Ich denke, Sie sollten gut zögern, bevor Sie TempData verwenden. TempData wird in der Sitzung gespeichert. Dies kann Auswirkungen auf Sie haben, wenn:

  1. Sie verwenden derzeit keine Sitzungen auf Ihrer Website
  2. Sie haben ein System, das auf einen hohen Durchsatz skaliert werden muss, dh Sie möchten den Sitzungsstatus lieber ganz vermeiden
  3. Sie möchten keine Cookies verwenden (ich weiß nicht, wie gut MVC derzeit Sitzungen ohne Cookies unterstützt).

Wenn Ihre Site über eine hohe Verfügbarkeit verfügen muss, gibt es zusätzliche Überlegungen zum Anwenden des Sitzungsstatus. Dies sind jedoch alles lösbare Probleme.

John Rayner
quelle
16
TempData muss nicht in der Sitzung gespeichert werden, obwohl es der Standardanbieter ist - weshalb es wahrscheinlich nicht im Methodendokument enthalten ist. Es gibt auch einen Cookie-Anbieter als Beispiel für das Schreiben eines benutzerdefinierten Anbieters.
FinnNk
3

Ich habe eine GetModel-Methode, die zuerst nach TempData ["Modell"] sucht und diese zurückgibt. Andernfalls lädt GetModel die entsprechenden Daten aus der Datenbank.

Es spart eine zusätzliche Last aus der Datenbank, wenn ich eine Aktion habe, die eine andere Ansicht zurückgeben muss, die dieselben Modelldaten erfordert.

Todd Smith
quelle
Yah, ich bin auf Folgendes gestoßen: (1) Überprüfen, ob ein Datensatz vorhanden ist, falls gültig, Weiterleiten an Seite (2) Laden des Datensatzes, um ihn für den Benutzer anzuzeigen. Die Datenbank wird also zur Validierung und zur Anzeige getroffen. Ich benutze fast TempData dafür, wollte aber meine Meinung überprüfen. Ich mag es, wenn Ihre Methode es enthält.
anonym
In diesem Szenario ist es besser, einen geeigneten Caching-Mechanismus zu verwenden.
nicodemus13
3

Testen Sie sitzungslose Controller in MVC3. Es stellte sich heraus, dass die Verwendung einer Sitzung die parallele Ausführung der Anforderungen eines einzelnen Benutzers verhindert und somit zu einer Leistungsminderung führt.

Da Tempdata standardmäßig eine Sitzung verwendet, können Sie diese Funktion nicht verwenden. Sie können auf die Verwendung von Cookies für Tempdata umsteigen, aber es ist etwas umständlich (zumindest für mich). Immer noch sauberer als Viewstate, also ist es vielleicht kein so großer Dealbreaker.

aaimnr
quelle
2
Sie haben Recht mit sitzungslosen Controllern und TempData verwendet die Sitzung. ABER WARTE! Sitzung ist keine schlechte Sache und Sie können Sessionless mit Session-Controllern kombinieren. Sie möchten wirklich Session_less_-Controller, wenn Sie viele AJAX-Aufrufe an den Server ausführen (über den Browser). Wenn Sie nur eine Seite gleichzeitig treffen, müssen Sie nicht sitzungslos sein. Tatsächlich sollte Ihnen das KEINEN Vorteil bringen ... weil Sie den Server nur EINMAL treffen. So ist es möglich zu mischen und anzupassen.
Pure.Krome
2

Warum hast du so eine Abneigung? Dieses Ding macht einfach seinen Job und macht es gut :)

Wenn es Ihnen nicht gefällt, weil es nicht stark typisiert ist, können Sie jederzeit einen Wrapper erstellen, der Ihnen eine stark typisierte Oberfläche bietet.

maxnk
quelle
2

Es ist wie mit ViewData, was bedeutet, dass es wahrscheinlich kein Sicherheitsrisiko darstellt. Aber ich würde lieber ViewData als TempData verwenden. Hier finden Sie einen Vergleich: http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

Je nach Design können Sie den Benutzer / Warenkorb oder das, was Sie benötigen, jederzeit in den temporären Daten in der Datenbank speichern und haben nur ein "IsReady" -Feld, das angibt, ob es abgeschlossen ist oder nicht, sodass es für später erweiterbar ist, wenn Sie es aufnehmen möchten Beachten Sie, dass Benutzer ihre Browser schließen können.

Filip Ekberg
quelle
2
Hinweis: Der Artikel, auf den Sie verlinken, war zeitlich auf dem neuesten Stand, ist jedoch nur für MVC1 korrekt. TempData hat sich in MVC2 ziemlich stark geändert.
Mikemanne
@ Mikemanne, ja. Aber die Antwort ist von Ende 2008. Aber vielleicht sollte die Antwort aktualisiert werden?
Filip Ekberg
0

Alle guten Antworten, haben Sie sich das angesehen, um Nachrichten weiterzugeben?

TempData und Session sind nicht die beste Idee für RESTful-Architekturen, da die meisten Sitzungen im Speicher gespeichert sind. Wenn Sie also eine Serverfarm verwenden möchten, ist die Benutzersitzung auf einem Server vorhanden, während die nächste Anforderung an einen anderen Server gesendet werden kann.

Schauen Sie sich diese Verwendung von TempData zum Weiterleiten von Nachrichten hier an.

http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/

Möglicherweise kann dies angepasst werden, um einen Abfragezeichenfolgenansatz zu verwenden, wenn er nur zum Umleiten zu einer anderen Seite verwendet wird.

Labyrinth
quelle