Risposte:
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.
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.
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
può aiutarti
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();
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))
{
}
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.
}
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).EntityValidationErrors
e 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.
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.