2013-01-10 17 views
5

Próbuję zaimplementować wzorzec PRG przy użyciu filtrów akcji [ImportModelStateFromTempData] i [ExportModelStateToTempData]. Ten wzór sprawdza się doskonale w płaskich modelach, ale nie mogę go uruchomić, gdy mam kolekcję dziecięcą. Mój model wygląda następująco:Wzór PRG MVC z dziećmi

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

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

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

mój regulator jest następujący:

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

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

    return RedirectToAction("Create"); 
} 

mój widok pozwala na dodanie nowych elementów do wyborów, i mam walidacji, że wybory muszą być unikalne. Kiedy moje ModelState nie jest prawidłowe, zapakuje ModelState w TempData i przekieruje do akcji HttpGet.

W tym momencie wszystkie moje wartości modelu podrzędnego są w ModelState, ale nie rekonstruuje je, gdy przechodzi model do widoku, dlatego mój widok pokazuje, że dodano 0 dzieci.

Czy istnieje sposób, aby jakoś połączyć modelState z modelem lub nie mogę użyć tego wzorca do obiektów podrzędnych?

Odpowiedz

1

wątpię [ImportModelStateFromTempData] będzie zrekonstruować model z ModelState, ja obrazowania to tylko coraz próbował użytkownika wartości i walidacji błędy, ponieważ kolekcja modeli nie jest inicjowana w tym momencie (GET) i nie przekazujesz kolekcji z POST, to po prostu renderuje stan początkowy modelu, to jest dlaczego dobrze sprawdza się w modelach płaskich, ale nie w kolekcjach takich jak w tym przypadku.

Musisz więc znaleźć sposób przekazania tej kolekcji lub modelu otworu z POST do akcji GET, a opcja to TempData.

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

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

Jeśli ten dźwięk jest zbyt brudny, możesz również zmienić na wzór "PRG Loose", co znacznie ułatwia http://stackoverflow.com/questions/8178821/is-there-a-name-for-the-prg-pattern- to nie robi przekierowania po niepowodzeniu sprawdzania poprawności? rq = 1 – JOBG

Powiązane problemy