MVC Validazione con ModelState.isValid attraverso una procedura guidata

2

Sto lavorando a un piccolo progetto educativo su MVC 3 e sto affrontando un piccolo problema, quando cerco di gestire la convalida nella mia applicazione attraverso una procedura guidata.

Ho cercato di trarre vantaggio dalla capacità di MVC3 di fornire contenuto di una vista diversa utilizzando lo stesso URL, quando si gestisce un metodo [HttpPost] su una pagina.

Nel mio caso, la classe del mio modello principale contiene circa il dieci% di proprietà di[Required], che vorrei esporre attraverso un piccolo wizard in 3 passaggi, quindi voglio che l'utente possa essere in grado di inserire le sue informazioni personali nel primo passo, quindi rispondi ad alcune domande nel secondo step e finalmente ricevi una mail di conferma dall'applicazione web con le sue credenziali nell'ultimo passaggio.

Non riesco ad accedere all'ultimo passaggio, a causa del metodo ModelState.isValid che utilizzo per gestire le convalide e che non può essere eseguito correttamente se definisco alcune proprietà come [Required] , ma non le inserisco la prima vista.

Poiché le risposte a queste domande rimangono in un paio di scelte, ho pensato che potrei usare un po 'di %ble% di% per evitare problemi di convalida, ma so che non è il modo corretto.

C'è qualcuno che vorrebbe aiutarmi a trovare un modo per estendere la mia convalida a quei tre passaggi? Grazie in anticipo e scusa per il mio inglese, non sono madrelingua.

    
posta Emmanuel TOPE 30.11.2011 - 16:20
fonte

2 risposte

2

Crea un modello per ciascuna pagina della procedura guidata anziché utilizzare i modelli di dominio che probabilmente stai utilizzando. Quindi puoi separare la convalida in modo appropriato.

    
risposta data 30.11.2011 - 17:01
fonte
0

Come scrisse Wyatt Barnett, la soluzione più immediata che viene in mente è quella di avere un oggetto specifico (una classe) per ogni pagina della procedura guidata. Se lavori utilizzando le annotazioni Required per far funzionare ModelState.IsValid , non penso che tu possa farlo in un altro modo.

Tuttavia, penso che ci sia un altro modo per farlo, come ricordo di aver fatto qualcosa di molto simile in Java / Struts qualche tempo fa. È possibile creare una nuova classe che eredita dalla classe del modello di dominio e aggiungere a quella classe solo una proprietà aggiuntiva, il passaggio corrente nella procedura guidata. Ora, non puoi fare la tua validazione usando le annotazioni, questo è il compromesso. Dovrai scrivere il tuo codice per convalidare il tuo nuovo modello (penso che tu debba implementare l'interfaccia IValidatable ) ma sarai in grado di eseguire convalide parziali che dipendono dal passo corrente nella procedura guidata. Ad ogni modo, indipendentemente dalla soluzione scelta (più classi o una classe ereditaria), penso che tu non possa usare le tue annotazioni esistenti. Il vantaggio principale di questa soluzione è che la tua procedura guidata corrisponde a una classe, quindi se la tua procedura guidata si estende su 10 pagine diverse, o solo due, il modello da validare non cambia, solo il codice di convalida.

Forse puoi persino scrivere alcune regole di convalida generiche che collegheranno una proprietà a un passaggio, quindi utilizzare reflection per convalidare solo le proprietà di quel particolare passaggio.

Inoltre, ricorda che non puoi davvero fidarti di una proprietà "currentStep" che proviene dal client!

    
risposta data 30.11.2011 - 17:19
fonte

Leggi altre domande sui tag