2013-03-08 7 views
7

Come individuare quale chiave in ModelState contiene un errore quando ModelState.IsValid è falso? Solitamente vorrei passare il mouse attraverso l'elenco ModelState.Values ​​controllando elemento per elemento per il conteggio errori> 0. Ma ora sto lavorando su una vista che ha alcuni elenchi di oggetti complessi, per un totale di 252 elementi ModelState (ogni elemento di ogni oggetto di ogni elenco ha una voce su ModelState.Keys).Come capire quale chiave di ModelState ha errore

Quindi, c'è un modo più semplice per indicare la fonte dell'errore?

risposta

13

È possibile controllare la raccolta ViewData.ModelState.Values e vedere quali sono gli errori.

[Httpost] 
public ActionResult Create(User model) 
{ 
    if(ModelState.IsValid) 
    { 
    //Save and redirect 
    } 
    else 
    { 
    foreach (var modelStateVal in ViewData.ModelState.Values) 
    { 
     foreach (var error in modelStateVal.Errors) 
     {    
      var errorMessage = error.ErrorMessage; 
      var exception = error.Exception; 
      // You may log the errors if you want 
     } 
    } 
    }   
    return View(model); 
} 
} 

Se si vuole veramente i tasti (il nome della proprietà), è possibile scorrere l'ModelState.Keys

foreach (var modelStateKey in ViewData.ModelState.Keys) 
{ 
    var modelStateVal = ViewData.ModelState[modelStateKey]; 
    foreach (var error in modelStateVal.Errors) 
    { 
     var key = modelStateKey; 
     var errorMessage = error.ErrorMessage; 
     var exception = error.Exception; 
     // You may log the errors if you want 
    } 
} 
+0

Questo mi ha aiutato a trovare il problema. Non era esattamente quello che stavo cercando, ma comunque risolto ... grazie! – leobelones

+0

Funziona, ma non risponde alla domanda; come scoprire quale KEY di ModelState ha un errore. In questa soluzione, otteniamo l'errore, ma non la chiave a cui questo errore appartiene. Come lo otteniamo? –

+1

@RensdeNobel Ho aggiornato la risposta per includere anche quella. – Shyju

1
ModelState.Values.SelectMany(v => v.Errors); 

è considerato più pulito.

+1

Restituisce solo i messaggi di errore senza chiavi. Non proprio quello che l'OP sta cercando. – Azimuth

+0

ModelState.Keys – markthewizard1234