2011-09-14 9 views
65

Ho una situazione in cui sto caricando un'immagine che l'utente ha selezionato dal suo file system locale. Il mio modulo a mio avviso, in pratica ha due pulsanti di invio. Uno è usato per inviare normalmente il modulo e tutte le convalide vengono eseguite. Il 2 è solo per caricare l'immagine, nel qual caso non voglio ancora convalidare.MVC3 Rimuovi errori ModelState

sono riuscito a disattivare la convalida lato client, dando il mio 'Caricare l' immagine' pulsante di invio un un valore di classe di "stile-name cancel", in modo da

<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" /> 

Ora, quando mi post indietro, il mio modello ha una proprietà UploadImageButton, quando questo pulsante viene cliccato, popola questa proprietà (il nome dell'input corrisponde alla proprietà). In questo modo, so se il modulo è stato inviato dal mio vero pulsante Invia o da UploadImageButton.

La mia domanda è questa ... Come disattivare la convalida ServerSide? Non voglio che le informazioni di riepilogo convalida vengano visualizzate quando l'utente fa clic su questo pulsante. So che è possibile aggiungere errori di modello personalizzati utilizzando questo

Sto cercando un mezzo per rimuovere gli errori del modello. È possibile?

EDIT:

Ecco quello che mi si avvicinò con:

foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) { 
    //ModelState.Remove(key); //This was my solution before 
    ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak 
} 
+0

Perché stai facendo un 'Dove (chiave => ModelState.Keys.. Contiene (chiave)) '' Sembra che la clausola Where sia ridondante, poiché ogni chiave in ModelState.Keys avrà il proprio ModelState.Keys.Contains (chiave) restituito true. –

+1

Ho aggiornato la domanda e il testo, per utilizzare il metodo più corto sul ModelState.ContainsKey, anche se il tuo errore nella tua ipotesi. Questi stanno facendo la stessa cosa. –

+0

Spiacente, potrei aver spiegato male o frainteso la tua risposta. Hai ragione che 'ModelState.ContainsKey (chiave)' e 'ModelState.Contains (chiave)' fanno la stessa cosa, ma il mio punto è che tutti i valori in 'ModelState.Keys.ToList()' saranno per natura contenuti in 'ModelState', quindi l'intera clausola' Where' è ridondante e rallenterà le prestazioni. Piccola cosa, però. –

risposta

116

È possibile rimuovere gli errori di modello facendo qualcosa di simile a questo:

if (ModelState.ContainsKey("{key}")) 
    ModelState["{key}"].Errors.Clear(); 
+1

Questo è esattamente quello che stavo cercando. Ho cambiato la mia risposta selezionata (mi dispiace Adam Tuliper). –

+0

Grazie, ho appena salvato il mio paio d'ore! – Agent007

+0

Nel caso ci si stesse chiedendo, anche questo ha effetto su 'ModelState.IsValid' –

55

Questo costruisce fuori risposte precedenti, ma lo semplifica un po 'di più:

foreach (var modelValue in ModelState.Values) 
{ 
    modelValue.Errors.Clear(); 
} 
6

In generale, non si desidera disattivare la convalida sul lato server o rimuovere manualmente gli errori ModelState. È fattibile, ma soggetta a errori poiché deve fare affidamento sulle stringhe come chiavi. Ho svettato la risposta su come rimuovere le chiavi, perché è corretta e utile, ma ti consiglio di non progettare te stesso in un caso in cui devi prenderlo in seria considerazione.

Nel tuo caso, hai più pulsanti di invio per lo stesso modulo, ma in realtà non stai inviando il modulo quando carichi l'immagine. Per impedire la convalida sul lato client, puoi utilizzare la classe "annulla" come hai già indicato, ma ti consiglio anche di avere il 2 ° pulsante di invio in un modulo diverso, nel qual caso non causa alcuna convalida sul tuo modulo principale.

C'è un secondo vantaggio nell'usare il modulo diverso: è possibile inviarlo a un metodo ActionResult diverso che gestirà solo la logica di caricamento dell'immagine. Questo diverso metodo semplicemente non si preoccuperebbe di controllare la proprietà "IsValid" dello stato del modello: si preoccupa solo se ci sono informazioni nell'immagine e che possono essere controllate separatamente. (Anche se si utilizza lo stesso metodo ActionResult, è possibile eseguire la canalizzazione della logica in modo da non fare affidamento sulla proprietà IsValid dello stato del modello.)

Se è necessario eliminare gli errori dallo stato del modello, e rende senso per cancellare tutti loro, provate questo:

foreach (var key in ModelState.Keys) 
{ 
    ModelState[key].Errors.Clear(); 
} 

questo vi evita di seconda ottenere i nomi chiave corretta, ma conserva dovrebbe esistere già i valori di tutti i valori (validi o non validi) nel modello.

Un'ultima cosa da controllare in questi casi è se si hanno valori a volte solo nella vista, che non causano la convalida lato client (non sono nella vista), ma si traducono in server- problemi di convalida laterale. In questo caso, è meglio usare @ Html.HiddenFor (model => model.PropertyName, se possibile, supponendo che il valore sia già stato impostato, non è visibile in questa vista.

4

Lo uso a volte , così ho fatto un metodo di estensione fuori di esso:

public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName) 
{ 
    if (m.ContainsKey(fieldName)) 
     m[fieldName].Errors.Clear(); 
    return m; 
} 

esso può essere utilizzato correntemente per cancellare l'errore per più campi

Problemi correlati