it-swarm.com.de

ASP.NET MVC - TempData - Gute oder schlechte Praxis

Ich verwende die AcceptVerbs-Methode, die in Scott Gus Preview 5-Blogeintrag zum Umgang mit Formulareinträgen in ASP.NET MVC beschrieben ist:

  • Benutzer erhält ein leeres Formular über GET
  • Der Benutzer sendet das ausgefüllte Formular über POST in derselben Aktion
  • Die Aktion validiert Daten, führt geeignete Maßnahmen durch und leitet zu einer neuen Ansicht um

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

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

Ist das überhaupt ein berechtigtes Anliegen, oder mache ich es mir?

94
anonymous

Ich denke, temporäre Daten sind ein Feuer-und-Vergessen-Mechanismus, um den Benutzer zu benachrichtigen. Es ist großartig, ihnen eine Erinnerung an etwas zu geben, das sie kürzlich getan haben, aber ich würde auch zögern, es in einem Benutzerprozess als erforderlichen Schritt zu betrachten. Der Grund ist, wenn sie die Seite aktualisieren, glaube ich, dass sie verschwunden wäre. Ich denke, ich zögere auch, es zu verwenden, da es nicht wirklich klar ist, wie zuverlässig es ist.

Ich frage mich, ob das Problem darin besteht, dass Sie die Aktion vor dem Bestätigungsschritt auf eine andere Seite umleiten lassen. Ich frage mich, ob Sie stattdessen nach dem ersten Senden genug Verarbeitung ausführen könnten, um den Bestätigungsdialog zu generieren, und dann die ursprüngliche Seite mit der Bestätigungsfrage zurückgeben. Ähnlich wie bei der Validierung, mit der Ausnahme, dass die Validierungsregel überprüft, ob der Bestätigungsschritt ausgeführt wurde (wobei die Bestätigungs-Benutzeroberfläche ausgeblendet ist, bis eine andere Validierung bestanden hat).

25

Keine Notwendigkeit, eine Abneigung gegen TempData zu haben ... Wenn sie jedoch nicht korrekt verwendet wird, kann dies sicherlich auf ein schlechtes Design hindeuten. Wenn Sie RESTful-URLs verwenden, ist TempData eine bewährte Methode zum Übertragen von Nachrichten aus Ihren POST - Aktionen in Ihre GET-Aktionen. Bedenken Sie:

Sie haben ein Formular unter URL Products/New. Das Formular Posts to Products/Create, mit dem das Formular validiert und das Produkt erstellt wird, leitet der Controller bei Erfolg zu URL Products/1 um und führt im Fehlerfall zurück zu products/New, um Fehlermeldungen anzuzeigen.

Products/1 ist nur die Standard-GET-Aktion für das Produkt, wir möchten jedoch eine Meldung anzeigen, 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 ob-Logik in die Ansicht ein.

Bei einem Fehler habe ich die in der formCollection eingegebenen Werte und eine Auflistung von Fehlernachrichten zu TempData in der Post-Aktion hinzugefügt und auf die ursprünglichen Aktionsprodukte/Neu ... umgeleitet. Ich habe der Ansicht Logik hinzugefügt, um die Formulareingaben mit den zuvor eingegebenen Werten zusammen mit etwaigen Fehlermeldungen. Scheint mir schön und sauber!

76
JasonD

Ich denke, Sie zögern vor der Verwendung von TempData. TempData wird in der Sitzung gespeichert. Dies kann Auswirkungen auf Sie haben, wenn:

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

Wenn für Ihre Site eine hohe Verfügbarkeit erforderlich ist, gibt es zusätzliche Überlegungen zum Anwenden des Sitzungsstatus. Dies sind jedoch alle lösbare Probleme.

31
John Rayner

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

Wenn ich eine Aktion habe, die eine andere Ansicht zurückgeben muss, für die dieselben Modelldaten erforderlich sind, wird eine zusätzliche Last aus der Datenbank eingespart.

3
Todd Smith

Check out Sessionless Controller in MVC3. Es stellte sich heraus, dass die Verwendung von session die parallele Ausführung von Anforderungen eines einzelnen Benutzers verhindert und somit zu einer Leistungsverschlechterung führt. 

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

3
aaimnr

Es ist wie mit ViewData zu arbeiten, was bedeutet, dass es wahrscheinlich kein Sicherheitsrisiko darstellt. Ich würde aber 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 was immer Sie benötigen in den Tempdata in der Datenbank ablegen und haben einfach ein "IsReady" -Feld, das angibt, ob es abgeschlossen ist oder nicht Denken Sie daran, dass Menschen ihre Browser schließen können.

2
Filip Ekberg

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

Wenn Sie es nicht mögen, weil es nicht stark typisiert ist, können Sie immer einen Wrapper erstellen, der Ihnen eine stark typisierte Schnittstelle bietet.

2
maxnk

Alle guten Antworten, haben Sie sich das angesehen, um Nachrichten weiterzuleiten.

TempData und Session sind die beste Idee für RESTful-Architekturen, da die meisten Sitzungen im Arbeitsspeicher gespeichert werden. 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 könnte. 

Schauen Sie sich hier diese Verwendung von TempData für das Weiterleiten von Nachrichten an.

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

Mabye Dies könnte angepasst werden, um einen Abfragezeichenfolgenansatz zu verwenden, wenn er nur für die Weiterleitung zu einer anderen Seite verwendet wird.

0
WarrenDodsworth