Riconvalida un ViewModel modificato all'interno di un metodo controller?
-
27-10-2019 - |
Domanda
MODIFICA - Stiamo utilizzando MVC4 Dev Preview ....
Sto implementando una pagina di modifica per una classe FishingTrip
. FishingTrip
contiene una raccolta figlia di semplici oggetti Crew
(ad esempio FishingTripID, CrewID, CrewPosition).
Sto utilizzando l ' l'approccio di Jarrett Meyer per aggiungere, modificare ed eliminare dalla raccolta Crew
.
Utilizzo una convalida discreta per specificare che le proprietà di Crew
sono tutte Required
.
Il mio problema: quando elimino logicamente un elemento dall'elenco (secondo il metodo di Jarrett), non voglio che l'elemento venga convalidato.
Ho ottimizzato con successo il metodo "removeRow" sul lato client per disabilitare la convalida discreta per l'elemento cancellato logicamente, in modo che il modulo venga pubblicato nonostante ci sia un elemento che contiene campi vuoti.
Nel mio metodo di controller [HttpPost] Edit
, ModelState.IsValid
inizia come falso (come previsto, a causa dell'elemento eliminato logicamente che contiene campi vuoti). Quindi rimuovo quell'elemento dal mio ViewModel .... ma ModelState.IsValid
è ancora falso.
In sintesi, (credo di) voler modificare il mio ViewModel all'interno del metodo del controller per rimuovere l'elemento offensivo, quindi chiamare una sorta di "revalidate" e visualizzare ModelState.IsValid
come true.
Qualche idea?
Soluzione
Dopo aver rimosso gli elementi offensivi, cancella ModelState e convalida di nuovo, in questo modo:
ModelState.Clear();
TryValidateModel(crew); // assumes the model being passed is named "crew"
Nota : fai attenzione quando usi il metodo TryValidateModel
perché questo metodo non convalida l'oggetto nidificato del modello (come menzionato da @Merenzo).
Altri suggerimenti
In ritardo al gioco, ma ancora:
Stavo anche cercando un modo per convalidare il modello dopo aver apportato alcune modifiche (più precisamente - agli elementi della sua raccolta nidificata) - e TryValidateModel
non ha funzionato per me, in quanto non funzionaelaborare oggetti annidati.
Infine, ho deciso con il raccoglitore di modelli personalizzato:
public class MyItemModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(MyItemModel))
{
MyItemModel item = (MyItemModel)bindingContext.Model;
//do required tweaks on model here
//(I needed to load some additional data from DB)
}
//validation code will be called here, in OnModelUpdated implementation
base.OnModelUpdated(controllerContext, bindingContext);
}
}
sulla classe del modello:
[ModelBinder(typeof(MyItemModelBinder))]
public class MyItemModel : IValidatableObject
{
//...
}