ASP.NET MVC auto-lega un modello aggiornati quando ModelState è valido su HttpPost
-
28-09-2019 - |
Domanda
Sto lavorando su un'applicazione ASP.NET MVC2. Sono venuto a realizzare una molto sorprendente, cosa ancora sorprendente che MVC fa dietro le quinte hanno a che fare con la ModelState e il modello vincolante. Ho un ViewModel che ha un sacco di dati - alcuni campi facenti parte di una forma, mentre altri sono semplicemente parte della UI. Su HttpPost, il mio metodo d'azione utilizza il DefaultModelBinder che i tentativi di impegnare l'intero modello, ma solo campi che facevano parte del modulo sono deserializzato con successo - tutti gli altri rimangono nullo. Questo va bene e comprensibile. Se il ModelState non è valido, ho bisogno di Aggiorna il modello dal db e bind quei particolari campi del modulo prima di tornare alla stessa vista edit per visualizzare questi errori di convalida ModelState associati.
Ecco dove il mio stupore e la curiosità arriva. Era la mia ipotesi che in modo per me di bind i campi del modulo con il modello rinfrescato, avevo bisogno di effettuare una chiamata a uno o UpdateModel()
TryUpdateModel<>()
, passando nel modello appena rinfrescato. Ad esempio:
[HttpPost]
public ActionResult EditDetail(EditDetailItemModel model)
{
if (model.IsValid)
{
// Save the results to the db
return RedirectToAction(...)
}
// Can't simply "return View(model)". Not all fields in EditDetailItemModel
// were part of the form - thus they returned null. Have to refresh
// model from the db.
var refreshedModel = RefreshModelFromDB();
// Is this line necessary?????
TryUpdateModel<EditDetailItemModel>(refreshedModel);
return View(refreshedModel);
}
Ma, quello che ho trovato era che se ho semplicemente tornato refreshedModel
alla vista senza fare una chiamata a TryUpdateModel<>()
, il modello aggiornato è stato automaticamente legarono con i valori dei campi modulo inviato !! Quindi, il TryUpdateModel<>()
non è necessario qui!
L'unico modo in cui posso dare un senso di esso è che dal momento che la ModelState è in uno stato non valido, una volta tornata la vista con il modello rinfrescato, il "motore di rendering MVC" loop attraverso gli errori ModelState e legato quei valori di proprietà con il mio modello rinfrescato. Questo è semplicemente impressionante! Ma, voglio una prova da questa ipotesi. Non riesco a trovare la documentazione per quanto riguarda questo ovunque sul web. Qualcuno può né confermare la mia ipotesi perché / come questo comportamento vincolante Composizione automatica è in corso e / o mi educare sul perché / come sta accadendo, si spera backup con alcuni link di documentazione on-line così ho capito più pienamente che cosa sta succedendo sotto le coperte?
Soluzione
public ActionResult EditDetail(EditDetailItemModel model)
Questa linea si esibirà modello vincolante. Pensate a parametri ActionMethod come sempre di essere popolato da una chiamata a UpdateModel.
non si è visto i valori di refreshedModel nella vista, si sta vedendo le voci ei valori ModelState da EditDetailItemModel.