ModelState.IsValid == false, perché?


120

Dove posso trovare l'elenco degli errori che rendono il ModelState non valido? Non ho visto alcuna proprietà di errori sull'oggetto ModelState.

Risposte:


45

A proposito di "può essere che 0 errori e IsValid == false": ecco il codice sorgente MVC da https://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#L37-L41

public bool IsValid {
    get {
        return Values.All(modelState => modelState.Errors.Count == 0);
    }
}

Ora, sembra che non possa essere. Bene, questo è per ASP.NET MVC v1.


mi sembra che non dovrebbe, c'è qualcosa di sbagliato in Values.All (modelState => modelState.Errors.Count == 0)?
Omu

Notare che l'errore può essere Messaggio o Eccezione; per esempio Html.ValidationSummary non mostra eccezioni (per motivi di sicurezza immagino); forse è per questo che non vedi gli errori? Come controlli l'assenza di errori?
queen3

1
ModelState.IsValid restituisce false
Omu

Ah ah, è ovvio ... come controlli "i valori hanno 0 errori"?
queen3

258

Poiché probabilmente stai programmando in Visual Studio, faresti meglio a sfruttare la possibilità di utilizzare punti di interruzione per passaggi di debug così semplici (per avere un'idea di quale sia il problema come nel tuo caso). Mettili appena davanti / nel punto in cui controlli ModelState.isValid e passa con il mouse sopra ModelState. Ora puoi facilmente sfogliare tutti i valori all'interno e vedere quale errore causa il ritorno di isvalid falso.

ModelState


3
potrebbe essere possibile che tutti i valori abbiano 0 errori e lo stato del modello non sia ancora valido?
Omu

come detto sopra, no questo non è possibile :). Da qualche parte deve esserci un conteggio errori! = 0.
bastijn

2
Come aggiunta, se ErrorMessage è ambiguo per te, puoi andare alle chiavi e ti mostrerà a quale variabile si riferisce.
Luminoso

1
nella tua vista, fai: @ Html.HiddenFor (model => model.Username) risolverà il problema!
Umit Kaya

1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);può aiutarti
Cirelli94

37

Incolla il codice seguente nel ActionResult del tuo controller e posiziona il debugger a questo punto.

var errors = ModelState
    .Where(x => x.Value.Errors.Count > 0)
    .Select(x => new { x.Key, x.Value.Errors })
    .ToArray();

3
La migliore risposta qui, dovrebbe essere valutata più in alto. Perché passare il mio tempo a scavare attraverso 5 livelli dell'oggetto ModelState nel debugger quando posso semplicemente ottenere gli errori da esso. Sarei lì tutta la mattina se seguissi la risposta con il punteggio più alto
Sean T

2
questo è il migliore in assoluto
giocattolo il

23
bool hasErrors =  ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);

o iterare con

    foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
    {

    }

potrebbe essere possibile che tutti i valori abbiano 0 errori e lo stato del modello non sia ancora valido?
Omu

1
Lo stato del modello avrà una chiave "Proprietà" e un errore associato nel dizionario. il messaggio di errore potrebbe essere vuoto, ma il conteggio degli errori rifletterà il conteggio delle proprietà non valide. Poiché il metodo ModelStateDictionary.AddModelError accetta una chiave e un'eccezione o una stringa di errore; è necessario aggiungere un errore di modello.
Michael G

13

A volte un raccoglitore genera un'eccezione senza messaggi di errore. Puoi recuperare l'eccezione con il seguente frammento per scoprire cosa c'è che non va:

(Spesso se il raccoglitore sta cercando di convertire stringhe in tipi complessi, ecc.)

 if (!ModelState.IsValid)
            {
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

// Breakpoint, Log or examine the list with Exceptions.

  }

1
Questo codice è stato molto utile per me, ma l'iterazione degli errori (eccezioni) per ottenere ogni .Message risultava in "riferimento all'oggetto non impostato su un'istanza di un oggetto". Quando ho cambiato z.Exception in z.ErrorMessage, sono stato in grado di visualizzare i messaggi di errore.
StackOverflowUser

Questa era la soluzione per me, passando a z.ErrorMessage, anche se non ho ricevuto un errore con z.Exception, solo valori nulli. Probabilmente vale la pena aggiornare la risposta originale.
esp

5

Se rimuovi il segno di spunta per ModelsState.IsValid e lasci che si verifichi un errore, se copi questa riga ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrorse la incolli nella sezione di controllo in Visual Studio ti darà esattamente qual è l'errore. Consente di risparmiare molto tempo nel controllare dove si trova l'errore.


1
Suggerimento davvero utile.
Ash

Questo è il miglior consiglio in questo thread. Il problema che ho avuto è stato uno stupido "." (punto) in UserName
mangia

3

La proprietà ModelState sul controller è in realtà un oggetto ModelStateDictionary. È possibile scorrere le chiavi sul dizionario e utilizzare il metodo IsValidField per verificare se quel particolare campo è valido.


3

Come è appena successo a me, questo può accadere anche quando aggiungi una proprietà richiesta al tuo modello senza aggiornare il tuo modulo. In questo caso ValidationSummary non elencherà il messaggio di errore.


1
Questo è successo a me. Grazie per la punta!
Lewis86
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.