Ci sono alcune proprietà nel mio modello di vista che sono facoltative al momento del salvataggio, ma necessarie quando si invia. In una parola, permettiamo il salvataggio parziale, ma l'intero modulo viene inviato, vogliamo essere sicuri che tutti i campi richiesti abbiano dei valori.Come convalidare in modo selettivo un attributo di annotazione dati?
Gli unici approcci posso pensare in questo momento sono:
manipolare la raccolta errori ModelState.
Il modello vista ha tutti gli attributi [Required]
in atto. Se la richiesta è parziale, lo diventa false
quando si immette l'azione del controller. Quindi eseguo tutti gli errori ModelState
(che è un ICollection<KeyValuePair<string, ModelState>>
) e rimuovi tutti gli errori generati dalle proprietà [Required]
.
Ma se la richiesta è di inviare l'intero modulo, non interferirò con gli attributi ModelState
e con gli attributi [Required]
.
utilizzare diversi modelli di visualizzazione per parziale salvare e presentare
Questo è ancora più brutto. Un modello di vista conterrà tutti gli attributi [Required]
, utilizzati da un metodo di azione per l'invio. Ma per il salvataggio parziale, inserisco i dati del modulo in un'azione diversa che utilizza uno stesso modello di visualizzazione senza tutti gli attributi [Required]
.
Ovviamente, vorrei finire con un sacco di modelli duplicati codice/vista.
La soluzione ideale
ho pensato se riesco a creare un attributo di annotazione di dati personalizzati [SubmitRequired]
per quelle proprietà richieste. In qualche modo, la convalida la ignora quando si salva parzialmente ma non quando si invia.
ancora non poteva avere un indizio chiaro. Chiunque può aiutare? Grazie.
È possibile utilizzare un [infallibile] (http://foolproof.codeplex.com/) '[RequiredIfTrue]' o un attributo simile (basato su un'ulteriore proprietà 'boRa SubmitRequired' nel proprio modello di vista. è 'false' quindi nessuna validazione verrà eseguita sulle proprietà decorate con' [RequiredIfTrue "SubmitRequired"] ', altrimenti le proprietà verranno convalidate –
Grazie, Stephen. Quel pacchetto è una beta con un ultimo aggiornamento nel 2012. Ma questo 'RequiredIf' ha puntato nella giusta direzione Apprezziamo molto – Blaise
Consentitemi di allegare il collegamento al codice che userò: http://foolproof.codeplex.com/SourceControl/latest#Foolproof/RequiredIf.cs – Blaise