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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top