2017-09-01 3 views
0

Ich habe ein Projekt mit einem Formular, das über mehrere Teile abgeschlossen ist. Z.B. Teil 1 enthält möglicherweise Ihren Namen und Teil 2 Ihre Adresse.Post-Redirect-Get-Muster in langen/Assistentenformularen

In MVC habe ich mehrere Ansichten, die jedes der Teile und ein Modell für alle Formulardaten darstellen.

Ich möchte die Formulardaten nach Abschluss jedes Teils speichern und den gespeicherten Datensatz im nächsten Teil abrufen (damit das gesamte Modell in jeder Phase verfügbar ist).

Ich benutze Post-Redirect-Get, um zu vermeiden, dass die 'Formular kann erneut gesendet werden' Warnungen von Browsern mit den Zurück-und Vorwärts-Tasten.

Controller-Code

[HttpGet] 
[Route("Form/Part/{id}")] 
public ActionResult Part(int id, int? recordId) 
{ 
    var model = new MyVM(); 
    if(recordId.HasValue) { 
     // get record from DB 
     // map record to 'model' 
    } 
    return View("Form.{id}", model); 
} 

[HttpPost] 
[Route("Form/Part/{id}")] 
public ActionResult Part(int id, MyVM model) 
{ 
    // map model to entity 
    // save/update entity 
    return RedirectToAction($"Form/Part/{id + 1}", new { recordId = recordId }) 
} 

Meine Frage ist, wie man am besten die ID des neu erstellten/aktualisierte Datensatz zu erhalten und es auf den nächsten Formteil übergeben.

Während der vorbei recordId als routeValueWerke, es bricht, wenn ich den Browser zurück, wie die Schaltfläche recordId im Abfragezeichenfolgeflag verloren, verwenden.

Ich habe überlegt, dies in der Sitzung vielleicht zu speichern, aber ich möchte nicht wirklich die HttpContext ins Spiel bringen, wenn ich nicht zu Testzwecken muss.

Gibt es einen empfohlenen Weg, um so etwas zu erreichen? Irgendwelche Gedanken über die verschiedenen Möglichkeiten, um den aktuellen Rekord zu verfolgen, würden sehr geschätzt werden.

+0

Sie könnten einen Cookie betrachten (und wenn 'id'' null' ist, überprüfen Sie den Cookie auf den Wert). Und Sie können auch den aktuellen Schritt hinzufügen, damit sich Benutzer abmelden und später zur Fertigstellung zurückkehren können (und im letzten Schritt entfernen). –

Antwort

1

Sie können TempData oder Session verwenden, um Daten zwischen Anfragen zu übergeben.

Ich würde eine große Klasse/Objekt mit allen Feldern aus dem Assistenten erstellen, es in der Sitzung z. B. Schlüssel "MyWizardData" werfen und es in den anderen Teilen des Assistenten abrufen.

Nach

// speichern/Aktualisierungsentität

Sie die ID haben, ist es in der Sitzung werfen und sie wieder in der nächsten Aktion greifen.

Wenn Sie die Sitzung nicht verwenden möchten, rufen Sie die ID nach dem Speichern/Aktualisieren ab und speichern Sie sie in einem Feld in der Datenbank in der Benutzertabelle. Oder speichern Sie einfach die UserId mit Ihrer erstellten Entity-Zeile. Dann können Sie es in jeder Aktion greifen.