2016-04-27 15 views
7

quando faccio una metodo create mi legano il mio scopo nel parametro e poi verifico se ModelState è valido in modo da aggiungere al database:Cosa fa ModelState.IsValid?

Ma quando ho bisogno di cambiare qualcosa prima di aggiungere al database (prima che io cambiarlo il ModelState potrebbe non essere valido quindi devo farlo) perché lo stato del modello non è ancora valido.

Cosa controlla esattamente questa funzione?

Questo è il mio esempio:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "EncaissementID,libelle,DateEncaissement,Montant,ProjetID,Description")] Encaissement encaissement) { 
    encaissement.Montant = Convert.ToDecimal(encaissement.Montant); 
    ViewBag.montant = encaissement.Montant; 
    if (ModelState.IsValid) { 
    db.Encaissements.Add(encaissement); 
    db.SaveChanges(); 
    return RedirectToAction("Index", "Encaissement"); 
    }; 
    ViewBag.ProjetID = new SelectList(db.Projets, "ProjetId", "nomP"); 
    return View(encaissement); 
} 
+0

Avete degli attributi richiesti sul modello? Se uno di questi campi obbligatori non è inserito, lo stato dei modelli non sarà valido. –

+0

tutti gli attributi richiesti sono stati inseriti ma lo stato del mio modello non è ancora valido! – kokomoi

+0

Guardate la mia risposta, forse la vostra vista è vincolante per int o datetime che non è annullabile, e questo può anche far sì che ModelState non sia valido. –

risposta

11

ModelState.IsValid indica se è stato possibile associare correttamente i valori in arrivo dalla richiesta al modello e se durante il processo di associazione modello sono state violate regole di convalida esplicitamente specificate.

Nell'esempio, il modello che viene associato è di tipo classe Encaissement. Le regole di convalida sono quelle specificate nel modello mediante l'uso di attributi, la logica e gli errori aggiunti nel metodo Validate()o semplicemente all'interno del codice del metodo di azione.

Se la proprietà IsValid è vera se i valori erano in grado di eseguire il bind correttamente nel modello E nessuna regola di convalida è stata interrotta nel processo.

Ecco un esempio di come un attributo di convalida e IValidatableObject potrebbero essere attuate sul tuo classe del modello:

public class Encaissement : IValidatableObject 
{ 
    // A required attribute, validates that this value was submitted  
    [Required(ErrorMessage = "The Encaissment ID must be submitted")] 
    public int EncaissementID { get; set; } 

    public DateTime? DateEncaissement { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var results = new List<ValidationResult>(); 

     // Validate the DateEncaissment 
     if (!this.DateEncaissement.HasValue) 
     { 
      results.Add(new ValidationResult("The DateEncaissement must be set", new string[] { "DateEncaissement" }); 
     } 

     return results; 
    } 
} 

Ecco un esempio di come la stessa regola di convalida può essere applicata all'interno del metodo di azione del vostro esempio:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "EncaissementID,libelle,DateEncaissement,Montant,ProjetID,Description")] Encaissement encaissement) { 

    // Perform validation 
    if (!encaissement.DateEncaissement.HasValue) 
    { 
     this.ModelState.AddModelError("DateEncaissement", "The DateEncaissement must be set"); 
    } 

    encaissement.Montant = Convert.ToDecimal(encaissement.Montant); 

    ViewBag.montant = encaissement.Montant; 

    if (ModelState.IsValid) { 

    db.Encaissements.Add(encaissement); 
    db.SaveChanges(); 
    return RedirectToAction("Index", "Encaissement"); 

    }; 

    ViewBag.ProjetID = new SelectList(db.Projets, "ProjetId", "nomP"); 

    return View(encaissement); 
} 

Vale la pena tenere presente che verranno convalidati anche i tipi di valore delle proprietà del modello. Ad esempio, non è possibile assegnare un valore di stringa a una proprietà int. Se lo fai, non sarà vincolato e l'errore verrà aggiunto anche al tuo ModelState.

Nell'esempio, il valore EncaissementID non può avere un valore di "Hello" registrato, ciò causerebbe l'aggiunta di un errore di convalida del modello e IsValid sarà falso.

È per uno dei motivi di cui sopra (e possibilmente di più) che il valore bool IsValid dello stato del modello sarà false.

+0

grazie ma è ancora fuggy! quando cambio qualcosa nel mio modello per esempio ho bisogno di convertire una stringa in un decimale poi aggiungo al database .. il modelstate.isvalid controlla il modello passato nel parametro non lo stato dopo i miei aggiornamenti? – kokomoi

7

ModelState.IsValid sarà essenzialmente vi dico se ci sono problemi con i tuoi dati inviati al server, sulla base delle annotazioni di dati aggiunti alle proprietà del modello.

Se, ad esempio, si dispone di un [Required(ErrorMessage = "Please fill")] e tale proprietà è vuota quando si registra il modulo sul server, ModelState non sarà valido.

Il ModelBinder controlla anche alcune cose di base per voi. Se, ad esempio, si dispone di un Datepicker Data di nascita e la proprietà a cui questo selettore è vincolante non è un valore nullo DateTime, il ModelState non sarà valido se la data è vuota.

Here e here sono alcuni post utili da leggere.

2

È possibile trovare un ottimo articolo su ModelState e i suoi usi here.

In particolare, la proprietà IsValid è un modo rapido per verificare se sono presenti errori di convalida dei campi in ModelState.Errors. Se non si è sicuri di quale sia la causa per la quale il Modello non è valido al momento del POST sul metodo del controller, è possibile esaminare la proprietà ModelState.Errors, che dovrebbe produrre almeno un errore di convalida del modulo.

+0

ModelState.Errors non esiste! c'è: SerializeErrors e AddModelError che è tutto – kokomoi

+2

È 'ModelState [" Proprietà "]. Errori'. In altre parole, 'ModelState' è un tipo di dizionario. Qualsiasi proprietà sul modello che viene pubblicato riceverà una chiave. Devi indicizzare il dizionario sulla proprietà appropriata, per vedere gli errori per quella proprietà. Se stai solo cercando di capire cosa sta causando l'errore, fai il debug e metti un punto di interruzione da qualche parte nel post azione. Quindi, controlla 'ModelState', tasto per tasto, guardando la collezione' Errors' su ognuno di essi. –