Ich verwende das Muster Redirect After Post in meiner ASP.NET MVC-Anwendung. Ich habe das folgende Szenario:Redirect After Post in ASP.NET MVC
- Benutzer geht an
/controller/index
wo er aufgefordert wird, ein Formular ausfüllen. - Formularwerte werden an
/controller/calculate
POST gesendet. - Die Aktion
Calculate
führt die Berechnung basierend auf der Eingabe durch und instanziiert ein komplexes Objekt, das die Ergebnisse der Operation enthält. Dieses Objekt wird inTempData
gespeichert und Benutzer wird zu/controller/result
umgeleitet. /controller/result
ruft das Ergebnis vonTempData
ab und rendert sie dem Benutzer.
Das Problem bei diesem Ansatz ist, dass, wenn der Benutzer F5 trifft, während die Ergebnisse in /controller/result
die Seite sieht nicht mehr als TempData
gemacht werden kann, ist abgelaufen worden und das Ergebnis Objekt ist nicht mehr verfügbar.
Dieses Verhalten wird von den Benutzern nicht gewünscht. Eine mögliche Lösung wäre, statt nach dem POST nur die Ergebnisansicht zu rendern. Wenn der Benutzer jetzt F5 drückt, erhält er einen Browserdialog, in dem er fragt, ob er das Formular erneut senden möchte. Dies war auch nicht erwünscht.
Eine mögliche Lösung, an die ich dachte, war, das Ergebnisobjekt zu serialisieren und es in der URL vor dem Umleiten zu übergeben, aber AFAIK gibt es einige Einschränkungen in der Länge einer GET-Anfrage und wenn das Objekt ziemlich groß wird, könnte ich diese Einschränkung (besonders wenn base64 codiert ist). Eine andere Möglichkeit wäre, das Session
Objekt anstelle von TempData
zu verwenden, um die Ergebnisse zu erhalten. Bevor ich diese Lösung implementiere, würde ich gerne wissen, ob es einen besseren Weg gibt.
UPDATE:
Untersuchung des Weiteren die Frage, die ich, dass herausgefunden, wenn ich in TempData
das Ergebnis Objekt neu setzen in der /controller/result
Aktion es tatsächlich funktioniert:
public ActionResult Result()
{
var result = TempData["result"];
TempData["result"] = result;
return View(result);
}
Aber das fühlt sich irgendwie von schmutzig. Könnte es bei diesem Ansatz irgendwelche Nebenwirkungen geben (z. B. Wechsel zu Out-of-Process-Sitzungsanbietern, da ich derzeit InProc verwende)?
Wenn Sie Redirect sagen, rufen Sie RedirectToAction? – Will
Ja, RedirectToAction. –