Cosa è valido per ModelState.IsValid in ASP.NET MVC in NerdDinner?


148

Sul NerdDinner esempio di professionista ASP.NET MVC 1.0 c'è un metodo per creare una nuova cena come muggito copiato (pagina 89 della versione NerdDinner gratuita).

Qui controlla ModelState.IsValid per true. Sembra verificare se il modello è valido per il database (ovvero rileva le conversioni dei tipi di dati, ad esempio date con formato non valido, ma non regole aziendali). È vero?

Quando si invia il modulo, se si riscontra un errore nella data, ModelState.IsValid sarà falso e verrà restituito un errore, ma solo per la data perché AddRuleViolations non è mai stato eseguito. Se rimuovi completamente il segno di spunta per ModelState.IsValid, otterrai tutti gli errori (a causa dell'eccezione), incluso un contrassegno nella data in cui non è valido. Quindi, perché il controllo per ModelState.IsValid è presente? Mi sto perdendo qualcosa?

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

Risposte:


143

ModelState.IsValidti dice se sono stati aggiunti errori del modello ModelState.

Il raccoglitore modello predefinito aggiungerà alcuni errori per problemi di conversione del tipo di base (ad esempio, passando un non-numero per qualcosa che è un "int"). È possibile popolare ModelState in modo più completo in base al sistema di convalida in uso.

Il DataAnnotationsraccoglitore del modello di esempio riempirà lo stato del modello con errori di convalida presi dagli DataAnnotationsattributi sul modello.


Brad è in qualche modo per scoprire se un modello decorato con DataAnnotations "IsValid" senza ModelState. (Supponiamo ad esempio che l'oggetto sia caricato da un file o utilizzato in
un'app

1
No, ModelState.IsValid è l'unico modo per sapere se si sono verificati errori di convalida (o conversione dei dati) durante l'associazione del modello.
Brad Wilson,

@Brad, quando dici "Puoi popolare ModelState in modo più completo in base al sistema di validazione che stai utilizzando", come si ottiene? C'è un modo per aprire il mio codice di validazione ModelState per il mio ViewModel? Sto usando EF4, quindi la maggior parte della mia convalida è automatica e pronta all'uso.
WEFX,

13
Usa: var errors = ModelState.Values.SelectMany(v => v.Errors);con un punto di interruzione per visualizzare eventuali problemi di convalida.
full_prog_full

A volte è un errore nella tabella correlata se i nomi delle proprietà sono stati modificati, le migrazioni non sono state eseguite e, di conseguenza, SaveChanges (); non riesce e non può verificarsi a causa della modifica.
Oracular Man,

25

Dall'errata: ModelState.AddRuleViolations(dinner.GetRuleViolations());

Dovrebbe essere:

ModelState.AddModelErrors(dinner.GetRuleViolations());

Riferimento: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html


5
A partire dal 2015 il AddModelErrorsmetodo non esiste.
Felipe Correa,

6
A partire dal 2016, il ModelState.AddModelErrors()metodo esiste
Giovanni

7
A partire dal 2017, ModelState.AddModelErroresiste il metodo non plurale .
Zachafer,

0

Sì, Jared e Kelly Orr hanno ragione. Uso il seguente codice come nell'eccezione di modifica.

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

invece di

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

Tutti i campi del modello che hanno tipi definiti, devono essere convalidati quando restituiti al controller. Se uno dei campi del modello non corrisponde al tipo definito, ModelState.IsValid restituirà false. Perché, questi errori verranno aggiunti in ModelState.

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.