48

EDIT - Stiamo utilizzando MVC4 Dev Preview ....Riconfigurazione di un ViewModel modificato con un metodo di controllo?

sto implementando una pagina di modifica per una classe FishingTrip. FishingTrip contiene una raccolta secondaria di oggetti semplici Crew (ad esempio FishingTripID, CrewID, CrewPosition).

Sto usando Jarrett Meyer's approach per aggiungere, modificare ed eliminare dalla raccolta Crew. Sto utilizzando la convalida non invadente per specificare che le proprietà di Crew sono tutte Required.

Il mio problema: quando cancello logicamente un elemento dall'elenco (come da metodo di Jarrett), non voglio che quell'elemento sia convalidato.

Ho modificato con successo il metodo "removeRow" sul lato client per disabilitare la convalida non invadente per l'elemento logicamente eliminato, in modo che il modulo verrà pubblicato nonostante ci sia un elemento che contiene campi vuoti.

Nel mio metodo di controllo [HttpPost] Edit, ModelState.IsValid inizia come falsa (come previsto -. A causa della voce logico-eliminato che contiene i campi vuoti) Quindi mi toglie che l'articolo dal mio ViewModel .... ma ModelState.IsValid è ancora falso.

In sintesi, I (penso che) desideri modificare il mio ViewModel all'interno del metodo controller per rimuovere l'elemento offendente, quindi chiamare una sorta di "riconvalida" e avere ModelState.IsValid visualizzato come true.

Qualche idea?

+0

Eventuali duplicati di [invocare manualmente convalida ModelState] (http://stackoverflow.com/questions/6360087/manual-invoking-modelstate-validation) – KyleMit

risposta

111

Dopo aver rimosso l'oggetto incriminato (s), deselezionare la ModelState e validare di nuovo, in questo modo:

ModelState.Clear(); 
TryValidateModel(crew); // assumes the model being passed is named "crew" 

Nota: Fate attenzione quando utilizzare il metodo TryValidateModel perché questo metodo non convalidare oggetto nidificato di modello (come menzionato da @Merenzo).

+3

Grazie a @councellorben - ModelState.Clear rimuove effettivamente tali errori (e l'intera raccolta ModelState.Keys) ma TryModelValidate non sembra ripopolare ModelState. Non sembra fare nulla? per esempio. Se non rimuovo l'elemento offendente, quindi chiami .Clear, quindi TryValidateModel, mi rimane un ModelState vuoto, anziché uno che corrisponde alla versione "pre-Clear()". – Merenzo

+0

Se si esamina il codice sorgente MVC (TryValidateModel in Controller.cs in System.Web.Mvc), TryValidateModel aggiunge eventuali errori a ModelState e l'ho usato a tale scopo nei progetti seveal. – counsellorben

+0

@councellorben: nei tuoi progetti, Clear() elimina tutti i ModedlState.Keys e TryValidateModel, quindi ripristina tutte le chiavi * e * aggiunge gli errori alle chiavi? (Ci scusiamo se utilizziamo MVC4 non MVC3 come inizialmente indicato). – Merenzo

2

ritardo al gioco, ma ancora: Sono stato anche alla ricerca di un modo per convalidare il modello dopo fare alcune modifiche ad esso (più precisamente - agli elementi della sua collezione nidificato) - e TryValidateModel non ha funzionato per me, in quanto non elabora oggetti nidificati.

Infine, ho risolto con il modello personalizzato legante:

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 
{ 
    //... 
} 
+0

Sto cercando di ottenere gli attributi DataAnnotation per convalidare nuovamente, ma non sembrano dopo OnModelUpdated. Qualche idea? – xr280xr

+0

Avevo creato e applicato un modello di raccoglitore personalizzato al modello di visualizzazione padre. Avevo bisogno di applicarlo alla VM figlio che conteneva direttamente la convalida. – xr280xr