2013-01-10 5 views
5

Ich versuche, das PRG-Muster mit den Aktionsfilter [ImportModelStateFromTempData] und [ExportModelStateToTempData] zu implementieren. Dieses Muster funktioniert gut für flache Modelle, aber ich kann es nicht funktionieren, wenn ich eine Kinderkollektion habe. Mein Modell sieht wie folgt aus:MVC PRG Muster mit Kindern

public class QuestionModel 
{ 
    public string QuestionText { get; set; } 

    public ICollection<ChoiceModel> Choices { get; set; } 
} 

public class ChoiceModel 
{ 
    public string ChoiceText { get; set; } 
} 

Mein Controller ist wie folgt:

[HttpGet, ImportModelStateFromTempData] 
public ActionResult Create() 
{ 
    return View(); 
} 

[HttpPost, ExportModelStateToTempData] 
public ActionResult Create(QuestionModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     // not getting here 
    } 

    return RedirectToAction("Create"); 
} 

Meine Ansicht ermöglicht es dem Benutzer neue Elemente in die Auswahl hinzuzufügen, und ich habe eine Bestätigung dafür, dass Entscheidungen eindeutig sein muss. Wenn mein ModelState nicht gültig ist, wird der ModelState in TempData verpackt und an die Aktion HttpGet weitergeleitet.

An diesem Punkt befinden sich alle Werte meines untergeordneten Modells in ModelState, aber es wird nicht rekonstruiert, wenn es das Modell an die Ansicht übergibt. Daher zeigt meine Ansicht, dass 0 untergeordnete Elemente hinzugefügt wurden.

Gibt es eine Möglichkeit, den ModelState irgendwie mit dem Modell zusammenzuführen, oder kann ich dieses Muster nicht mit untergeordneten Objekten verwenden?

Antwort

1

ich [ImportModelStateFromTempData] Zweifel rekonstruieren das Modell aus ModelState, ich Bebilderung es nur immer die Benutzer hat versucht, Werte und Validierung verwenden müssen Fehler, so wie die Modellsammlung zu diesem Zeitpunkt (GET) nicht initialisiert wird und Sie die Sammlung nicht aus dem POST übergeben, wird es nur den Modell-Anfangszustand, das heißt Warum funktioniert es gut mit flachen Modellen, aber nicht mit Sammlungen wie in diesem Fall.

Sie müssen also eine Möglichkeit finden, diese Auflistung oder das Lochmodell von POST an die GET-Aktion zu übergeben, und die Option ist TempData.

//POST - if validation fails 
TempData["model"] = model; 

//GET - must check if TempData["model"] is null first 
QuestionModel model = (QuestionModel)TempData["model"]; 
+0

Wenn das klingt zu chaotisch Sie können auch zu einem 'PRG Loose' Muster ändern, es wird viel einfacher http://stackoverflow.com/questions/8178821/is-there-a-name-for-the-prg-pattern- that-doesnt-redirect-on-failed-Validierung? rq = 1 – JOBG