Wie in ASP.NET MVC RedirectToAction ohne Anforderung Daten zu verlieren

stimmen
115

Mit ASP.NET MVC gibt es Situationen (wie zum Beispiel Formulareinreichung) , die eine erfordern RedirectToAction.

Eine solche Situation ist, wenn Sie Validierungsfehler nach einer Formularübermittlung auftreten und müssen zurück in die Form umgeleitet werden, würde aber die URL wie die URL der Form zu reflektieren, nicht die Aktionsseite es einreicht.

Als ich das Formular benötigen , um die ursprünglich enthalten POSTed Daten, Benutzerfreundlichkeit sowie die Validierung, wie kann ich pass die Daten durch das RedirectToAction()? Wenn ich die Viewdata - Parameter verwenden, meine POSTwerden Parameter geändert GETParameter.

Veröffentlicht am 05/08/2008 um 06:33
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
76

Die Lösung ist die TempData Eigenschaft zu verwenden, um die gewünschte Anforderung Komponenten zu speichern.

Zum Beispiel:

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

Dann in Ihrer „Form“ Aktion können Sie 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);
}
Beantwortet am 05/08/2008 um 06:43
quelle vom benutzer

stimmen
36

Beachten Sie, dass TempData die Form Sammlung in der Sitzung speichert. Wenn Sie nicht, dass das Verhalten möchten, können Sie die neue ITempDataProvider-Schnittstelle implementieren und einen anderen Mechanismus verwenden Temp zum Speichern von Daten. Ich würde das nicht tun, wenn Sie für eine Tatsache wissen (über Messung und Profilierung), dass die Verwendung von Sitzungsstatus Sie verletzt.

Beantwortet am 07/08/2008 um 06:12
quelle vom benutzer

stimmen
13

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

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Beantwortet am 05/04/2009 um 10:36
quelle vom benutzer

stimmen
8

Es gibt eine andere Art und Weise, die TempData vermeidet. Das Muster Ich mag beinhaltet für 1 Aktion zu schaffen sowohl das Original machen und neu rendern der unwirksamen Form. 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 wenig pseudoy. Mit diesem können Sie 1 Aufruf erstellen, um die Form, Wieder Anzeige der Werte zu handhaben machen (da die Form mit früheren Werten gefüllt werden), und zeigt Fehlermeldungen.

Wenn die Buchung auf diese Aktion, wenn seine Gültigkeit überträgt sie an einem anderen Aktionssteuerung über.

Ich versuche , dieses Muster einfach in die machen .net Validation Framework , wie wir Unterstützung für MVC bauen aus.

Beantwortet am 25/08/2008 um 23:06
quelle vom benutzer

stimmen
2

Wenn Sie Daten zu übergeben, um die umgeleiteten Aktion mögen, ist die Methode, die Sie verwenden:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Beantwortet am 30/11/2013 um 09:39
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more