Wie RedirectToAction in ASP.NET MVC ohne Anforderungsdaten zu verlieren

Bei Verwendung von ASP.NET MVC gibt es Situationen (z. B. das Senden von Formularen), für die möglicherweise eine RedirectToAction erforderlich ist.

Eine solche Situation liegt vor, wenn Sie nach der Übermittlung eines Formulars auf validationserrors stoßen und zum Formular zurückgeleitet werden müssen. Die URL sollte jedoch die URL des Formulars widerspiegeln, nicht die Aktionsseite, auf der das Formular übermittelt wird.

Da das Formular die ursprünglichen POST ed-Daten enthalten muss, kann ich aus Gründen der Benutzerfreundlichkeit sowie zu validationszwecken die Daten über RedirectToAction() weiterleiten. Wenn ich den Parameter viewData verwende, werden meine POST Parameter in GET Parameter geändert.

   

Die Lösung besteht darin, die Eigenschaft TempData zum Speichern der gewünschten Request-Komponenten zu verwenden.

Zum Beispiel:

 public ActionResult Send() { TempData["form"] = Request.Form; return this.RedirectToAction(a => a.Form()); } 

Dann kannst du in deiner “Form” -Aktion gehen:

 public ActionResult Form() { /* Declare viewData etc. */ if (TempData["form"] != null) { /* Cast TempData["form"] to System.Collections.Specialized.NameValueCollection and use it */ } return View("Form", viewData); } 

Beachten Sie, dass TempData die Formularsammlung in der Sitzung speichert. Wenn Ihnen dieses Verhalten nicht gefällt, können Sie die neue ITempDataProvider-Schnittstelle implementieren und einen anderen Mechanismus zum Speichern von temporären Daten verwenden. Ich würde das nicht tun, es sei denn, Sie wissen durch Messung und Profiling, dass die Verwendung des Session-Status Sie verletzt.

Werfen Sie einen Blick auf MVCContrib , Sie können dies tun:

 using MvcContrib.Filters; [ModelStateToTempData] public class MyController : Controller { // ... } 

Es gibt einen anderen Weg, der tempdata vermeidet. Das Muster, das ich mag, beinhaltet das Erstellen von 1 Aktion sowohl für das ursprüngliche Rendern als auch für das erneute Rendern des ungültigen Formulars. Es geht ungefähr so:

 var form = new FooForm(); if (request.UrlReferrer == request.Url) { // Fill form with previous request's data } if (Request.IsPost()) { if (!form.IsValid) { ViewData["ValidationErrors"] = ... } else { // update model model.something = foo.something; // handoff to post update action return RedirectToAction("ModelUpdated", ... etc); } } // By default render 1 view until form is a valid post ViewData["Form"] = form; return View(); 

Das ist das Muster mehr oder weniger. Ein kleiner Pseudoy. Damit können Sie eine Ansicht erstellen, um das Formular zu verarbeiten, die Werte erneut anzuzeigen (da das Formular mit vorherigen Werten gefüllt wird) und Fehlermeldungen anzuzeigen.

Wenn der Eintrag für diese Aktion gültig ist, überträgt er die Kontrolle an eine andere Aktion.

Ich versuche, dieses Muster im .NET-validations-Framework zu vereinfachen, da wir Unterstützung für MVC aufbauen.

Wenn Sie Daten an die umgeleitete Aktion übergeben möchten, können Sie folgende Methode verwenden:

 return RedirectToAction("ModelUpdated", new {id = 1}); // The definition of the action method like public ActionResult ModelUpdated(int id);