c# - RedirectToAction in ASP.NET MVC, ohne Anforderungsdaten zu verlieren

Translate

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

Eine solche Situation besteht darin, dass nach dem Senden eines Formulars Validierungsfehler auftreten und Sie zum Formular zurückleiten müssen, die URL jedoch die URL des Formulars widerspiegeln soll, nicht die Aktionsseite, an die es gesendet wird.

Da benötige ich das Formular, um das ursprünglich zu enthaltenPOSTWie kann ich die Daten aus Gründen der Benutzerfreundlichkeit sowie zu Validierungszwecken durch die Daten übertragen?RedirectToAction()? Wenn ich den Parameter viewData verwende, wird myPOSTParameter werden auf geändertGETParameter.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

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

Zum Beispiel:

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

Dann können Sie in Ihrer "Formular" -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);
}
Quelle
Translate

Beachten Sie, dass TempData die Formularsammlung in einer 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 nur tun, wenn Sie sicher sind (durch Messung und Profilerstellung), dass die Verwendung des Sitzungsstatus Sie verletzt.

Quelle
Dan
Translate

Schau es dir anMVCContrib, du kannst das:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Quelle
Translate

Es gibt einen anderen Weg, der Tempdaten vermeidet. Das Muster, das mir gefällt, beinhaltet das Erstellen einer 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 mehr oder weniger das Muster. Ein bisschen Pseudo. Mit dieser Option können Sie eine Ansicht erstellen, um das Rendern des Formulars zu übernehmen, die Werte erneut anzuzeigen (da das Formular mit vorherigen Werten gefüllt wird) und Fehlermeldungen anzuzeigen.

Wenn die Buchung für diese Aktion gültig ist, überträgt sie die Kontrolle auf eine andere Aktion.

Ich versuche, dieses Muster in der zu vereinfachen.net Validierungsframeworkwährend wir die Unterstützung für MVC ausbauen.

Quelle
Translate

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);
Quelle