2008-12-22 6 views
94

Ich bin mit der AcceptVerbs Methode ausführlich in Scott Gu Vorschau 5 Blog-Beitrag für in ASP.NET MVC mit Formulareinträgen zu tun:ASP.NET MVC - TempData - gute oder schlechte Praxis

  • Benutzer ein leeren bekommen Form über GET
  • Benutzerbesetze die in Form per Post an die gleiche Aktion
  • die Aktionsdaten validiert, geeignete Aktionen und leitet zu einer neuen Sicht

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

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

Ist das überhaupt ein berechtigtes Problem, oder erfinde ich es?

+1

Überlegen Sie, ob Sie den Schritt "Bestätigen" als JavaScript-Dialog ausführen. Weniger Server-Roundtrips und Sie werden nicht auf dieses Problem stoßen. – ajma

Antwort

24

Ich denke, dass Temp-Daten als ein Feuer-und-Vergessen-Mechanismus für die Benachrichtigung des Benutzers. Es ist großartig, sie an etwas zu erinnern, was sie kürzlich getan haben, aber ich würde auch zögern, es zu einem notwendigen Schritt in einem Benutzerprozess zu machen. Der Grund ist, wenn sie die Seite aktualisieren, glaube ich, dass es weg wäre. Nun, ich schätze, ich zögere auch, es zu benutzen, da es nicht wirklich gut definiert ist, wie zuverlässig es ist.

Ich frage mich, ob das Problem ist, dass Sie die Aktion auf eine andere Seite vor dem Schritt bestätigen müssen. Ich frage mich, ob Sie stattdessen, nachdem sie zuerst gesendet haben, genug Verarbeitung vornehmen könnten, um den Bestätigungsdialog zu erzeugen, und dann die Originalseite mit der Bestätigungsfrage zurückgeben. Ähnlich wie bei der Validierung, mit der Ausnahme, dass die Validierungsregel prüft, ob der Bestätigungsschritt durchgeführt wurde (wobei die Bestätigungs-Benutzeroberfläche ausgeblendet wurde, bis die andere Validierung erfolgreich war).

2

Es ist wie mit ViewData, was bedeutet, dass es wahrscheinlich kein Sicherheitsrisiko ist. 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 was auch immer Sie benötigen in der Datenbank speichern und nur ein "IsReady" -Feld haben, das anzeigt ob es abgeschlossen ist oder nicht, Es ist erweiterbar für später, wenn Sie daran denken wollen, dass Leute ihren Browser schließen können.

+0

Zufälliges Downvote? –

+2

Hinweis: Der Artikel, den Sie verlinken, war für seine Zeit auf dem neuesten Stand, ist aber nur für MVC1 korrekt. TempData hat sich in MVC2 ziemlich verändert. – mikemanne

+0

@mikemanne, ja. Aber die Antwort ist von Ende 2008. Aber vielleicht sollte die Antwort aktualisiert werden? –

2

Warum haben Sie so eine Abneigung? Dieses Ding ist einfach machen seine Arbeit und machen es gut :)

Wenn Sie es nicht weil es nicht stark typisiert mag, können Sie immer einen Wrapper um, der Ihnen stark typisierte Schnittstelle bieten wird.

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 speichert eine zusätzliche Belastung von der Datenbank, wenn ich eine Aktion habe, die eine andere Ansicht zurückgeben muss, die die gleichen Modelldaten benötigt.

+0

Yah, ich habe in diese: (1) validiert einen Datensatz existiert, wenn gültig, umleiten auf Seite (2) laden Datensatz für den Benutzer anzuzeigen. So wird die Datenbank zur Validierung und zur Anzeige getroffen. Ich benutze fast TempData dafür, aber fühlte sich wie Meinungen zu überprüfen. Ich mag deine Methode, um es zu enthalten. – anonymous

+0

Es wäre besser, einen geeigneten Caching-Mechanismus in diesem Szenario zu verwenden. – nicodemus13

31

Ich denke, Sie tun gut zu zögern, bevor Sie TempData verwenden. TempData wird in der Sitzung gespeichert und dies für Sie Auswirkungen haben können, wenn:

  1. Sie Sitzungen verwenden Sie nicht auf Ihrer Website jetzt
  2. Sie haben ein System, das auf hohen Durchsatz skalieren soll, das heißt, Sie‘ d bevorzugen Sitzungszustand insgesamt
  3. Sie keine Cookies wollen zu vermeiden, verwenden (ich weiß nicht, wie gut MVC cookieless Sitzungen jetzt unterstützt)

Wenn Ihre Website muss eine hohe Verfügbarkeit, dann gibt sind zusätzliche Überlegungen zum Anwenden des Sitzungsstatus, aber diese sind alle lösbar die Probleme.

+16

TempData muss nicht in der Sitzung gespeichert werden, obwohl es der Standardanbieter ist - wahrscheinlich deshalb nicht im Methodendokument. Es gibt auch einen Cookie-Anbieter, der als Beispiel für das Schreiben eines benutzerdefinierten Anbieters dient. – FinnNk

76

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

Sie haben ein Formular bei URL Products/New. Das Formular Posts to Products/Create, das das Formular validiert und das Produkt erstellt, schaltet den Controller bei Erfolg auf URL Products/1 um und würde bei einem Fehler zurück zu Produkten/Neu umleiten, um Fehlermeldungen anzuzeigen.

Produkte/1 ist nur die Standard-GET-Aktion für das Produkt, aber wir möchten, dass eine Nachricht anzeigt, dass der Einsatz erfolgreich war. TempData ist dafür perfekt. Fügen Sie die Nachricht zu TempData im Post-Controller hinzu und fügen Sie einige if-Logik in die Ansicht ein und fertig.

Bei einem Fehler habe ich die Werte, die in der FormCollection und einer Sammlung von Fehlermeldungen zu TempData in der Post-Aktion eingegeben wurden, und umleiten zu den Anfang Aktion Prodcuts/New hinzugefügt. Ich habe der Ansicht Logik hinzugefügt, um die Formulareingaben mit den zuvor eingegebenen Werten zusammen mit eventuellen Fehlermeldungen zu füllen. Scheint nett und sauber zu mir!

+0

Warum funktioniert das noch, wenn Sie direkt zu 'Products/New' zurückkehren können? Welchen Wert fügt 'Products/Create' hinzu? – mpen

+2

@Mark, mit Products/Create verhindert die Situation, in der der Benutzer die Aktion per Postback abschließt, dann bei einer späteren Aktualisierung (oder einem Bookmark & ​​Return) versehentlich die Aktion neu kompiliert. Für mehr, siehe http://en.wikipedia.org/wiki/Post/Redirect/Get – ehdv

+2

@ehdv: Aber tut es wirklich? Bei Erfolg wird auf eine andere Seite umgeleitet, bei einem Fehler sollten die Formularfehler angezeigt werden, und es sollten keine Maßnahmen ergriffen werden, damit kein Schaden entsteht. Es würde nur verhindern, dass die lästige "Bist du sicher, dass du die Nachricht erneut versenden willst", was ich oft möchte. Ich denke, es hängt von deinem Design ab, also kann ich deinen Standpunkt sehen. – mpen

3

Auschecken sessionless controllers 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 verschlechterten Leistung führt.

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

+2

Sie haben mit Sessionless Controllern Recht und TempData verwendet die Session. ABER WARTE! Session ist keine schlechte Sache und Sie können Sessionless mit Session Controllern mischen und abgleichen. Sie möchten wirklich Session_less_Controller, wenn Sie viele AJAX-Aufrufe an den Server (vom Browser) ausführen. Wenn du nur eine Seite gleichzeitig bearbeitest, musst du nicht sessionlos sein. In der Tat, das sollte Ihnen keinen Vorteil geben ... weil Sie nur den Server ONCE treffen. So ist es möglich zu mischen und anzupassen. –

0

Alle guten Antworten, haben Sie sich das für die Weitergabe von Nachrichten angesehen.

TempData und Session sind nicht die beste Idee für REST-konforme Architekturen, da die meisten Sitzungen im Speicher abgelegt 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.

Das Gesagte, werfen Sie einen Blick auf diese Verwendung von TempData für die Weitergabe von Nachrichten hier.

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

Mabye könnte dies eine Query-String-Ansatz zu verwenden, werden angepasst, wenn nur für Umleitung auf eine andere Seite der Benachrichtigung verwendet.