Wie RedirectToAction in ASP.NET MVC ohne zu verlieren Daten anfordern
-
08-06-2019 - |
Frage
Verwendung ASP.NET MVC-es gibt Situationen (wie z.B. Formular), für die eine RedirectToAction
.
Eine solche situation ist, wenn Sie auftreten, Validierungs-Fehler nach einer Formular Vorlage und müssen die Umleitung zurück auf die form, sondern möchte, dass die URL zu reflektieren, die URL von der form, nicht der Seite Aktion die Sie legt.
Als ich benötigen, die form zu enthalten, die ursprünglich POST
ed-Daten, die für Benutzerfreundlichkeit, als auch die Validierung, wie kann ich übergeben Sie die Daten durch die RedirectToAction()
?Wenn ich das viewData-parameter, meine POST
Parameter wird geändert werden, um GET
Parameter.
Lösung
Die Lösung: verwenden Sie die TempData-Eigenschaft, um speichern Sie die gewünschte Anfrage-Komponenten.
Zum Beispiel:
public ActionResult Send()
{
TempData["form"] = Request.Form;
return this.RedirectToAction(a => a.Form());
}
Dann in Ihrer "Form" Aktion, die Sie gehen können:
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);
}
Andere Tipps
Beachten Sie, dass TempData speichert die Kollektion form in der Sitzung.Wenn Sie nicht möchten, dass Verhalten, können Sie bei der Umsetzung der neuen ITempDataProvider Schnittstelle, und verwenden einen anderen Mechanismus für die Speicherung von temporären Daten.Ich würde das nicht tun, es sei denn, Sie wissen, für eine Tatsache (über die Messung und Profilierung), die die Verwendung von Session-Staat ist, dich zu verletzen.
Werfen Sie einen Blick auf MVCContrib, Sie können dies tun:
using MvcContrib.Filters;
[ModelStateToTempData]
public class MyController : Controller {
//
...
}
Es ist ein weiterer Weg, die verhindert, tempdata.Das Muster, das ich gerne umfasst das erstellen von 1-Aktion für die ursprüngliche Rendern und neu Rendern, die der unwirksamen in form.Es geht so etwas wie dieses:
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 wenig pseudoy.Mit diesem können Sie erstellen 1 zeigen Sie behandeln rendering form, re-die Darstellung der Werte (da die form gefüllt wird, die mit früheren Werten), und zeigt Fehler Nachrichten.
Bei der Veröffentlichung dieser Aktion, wenn Sie die gültigen übergibt er die Kontrolle über zu einer anderen Aktion.
Ich bin versucht zu machen, dieses Muster einfach in der .net-Validierungs-framework wie wir bauen-support für MVC.
Wenn Sie möchten, dass die übertragung von Daten von der Weiterleitung Aktion, die Methode, die Sie verwenden könnten, ist:
return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like public ActionResult ModelUpdated(int id);