2013-01-10 39 views
5

Sto tentando di implementare il modello PRG utilizzando i filtri di azione [ImportModelStateFromTempData] e [ExportModelStateToTempData]. Questo modello funziona alla grande per i modelli piatti, ma non riesco a farlo funzionare quando ho una collezione figlio. Il mio modello assomiglia a questo:Modello MVG PRG con bambini

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

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

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

mio controller è la seguente:

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

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

    return RedirectToAction("Create"); 
} 

mio punto di vista permette all'utente di aggiungere nuovi elementi per le scelte, e ho una convalida che le scelte devono essere univoci. Quando il mio ModelState non è valido, impacchetta il ModelState in TempData e reindirizza all'azione HttpGet.

A questo punto tutti i valori del modello figlio sono in ModelState, ma non li ricostruisce quando passa il modello alla vista, quindi la mia vista mostra che sono stati aggiunti 0 figli.

C'è un modo per unire in qualche modo ModelState con il Modello o non posso utilizzare questo modello con oggetti figlio?

risposta

1

dubito [ImportModelStateFromTempData] sarà ricostruire il modello dalla ModelState, ho l'imaging solo ottenere i utente ha tentato valori e convalida errori, così come la raccolta del modello non è inizializzata a questo punto (GET) e non si sta passando la raccolta dal POST, verrà solo visualizzato lo stato iniziale del modello, cioè perché funziona bene con modelli piatti ma non con collezioni come in questo caso.

Quindi è necessario trovare un modo per passare tale raccolta o il modello del foro dal POST all'azione GET e l'opzione è TempData.

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

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

Se questo suono troppo disordinato puoi anche passare a un pattern 'PRG Loose', diventa molto più semplice http://stackoverflow.com/questions/8178821/is-there-a-name-for-the-prg-pattern- che-doesnt-redirect-on-validazione fallita? RQ = 1 – JOBG

Problemi correlati