2009-11-24 14 views

risposta

31

Chi "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 può essere. Bene, questo è per ASP.NET MVC v1.

+0

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

+0

Si noti che l'errore può essere Messaggio o Eccezione; ad esempio Html.ValidationSummary non visualizza eccezioni (per motivi di sicurezza, immagino); forse è per questo che non vedi errori? Come si controllano gli errori? – queen3

+1

ModelState.IsValid dà false – Omu

2

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.

19
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)) 
    { 

    } 
+0

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

+1

Il modelstate 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 valido. Poiché il metodo ModelStateDictionary.AddModelError accetta una chiave e un'eccezione o una stringa di errore; è necessario aggiungere un errore del modello. –

195

Come probabilmente stai programmando in Visual Studio è meglio sfruttare la possibilità di utilizzare i punti di interruzione per tali operazioni di debug semplici (ottenere un idea di quello che è il problema come nel tuo caso). Basta posizionarli di fronte/nel luogo in cui si controlla ModelState.isValid e si passa con il mouse su ModelState. Ora puoi facilmente sfogliare tutti i valori all'interno e vedere quale errore causa false restituzioni false.

modelstate

+3

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

+0

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

+0

Questa spiegazione mi ha aiutato molto. Grazie! – Branislav

10

A volte un raccoglitore genera un'eccezione senza messaggi di errore. È possibile recuperare l'eccezione con il seguente frammento di scoprire che cosa è sbagliato:

(Spesso se il legante sta cercando di convertire le stringhe di 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. 

    } 
+0

Questo codice è stato molto utile per me, ma iterando gli errori (Eccezioni) per ottenere ogni .Message ha comportato il "riferimento dell'oggetto non impostato su un'istanza di un oggetto". Quando ho cambiato z.Exception to z.ErrorMessage, sono riuscito a visualizzare i messaggi di errore. – StackOverflowUser

0

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

4

Incollare il codice seguente in ActionResult del controller e posizionare il debugger a questo punto.

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