Domanda

Aggiornamento di ModelState

Salve, ho una domanda su ModelState in un controller MVC ASP.NET.

Quando l'utente seleziona una determinata opzione dalla vista, la data di inizio e la data di fine per la "certificazione" verrà impostato in base alle altre date inserite.

Il problema è che le date di certificazione tornano come null e la nostra classe CertificationMetaData specifica i campi come [Obbligatorio], quindi ModelState non è valido non appena viene caricata l'azione.

La rimozione manuale degli errori ModelSate consente di farlo funzionare ma mi chiedevo se esiste un modo migliore per farlo? C'è un modo per aggiornare ModelState? Devo rendere i campi non richiesti? O dovrei aggiungere un valore di data dalla vista con javascript?

public ActionResult Create(FormCollection fc, Certification certification, Absence absence)
{
    if (certification.CertificationTypeID == 1)
    {
        certification.CertificationStartDate = absence.StartDate;
        certification.CertificationEndDate = absence.StartDate.AddDays(7);
        this.ModelState.Remove("CertificationStartDate");
        this.ModelState.Remove("CertificationEndDate");
    }

    if (this.ModelState.IsValid)
    {
        // save
        return RedirectToAction("Index");
    }
     return View();
}

Inoltre, come puoi vedere, ho codificato il valore ID per il tipo di certificazione. Qual è il modo migliore per confrontare i valori con i valori della tabella di ricerca? Un enum è il modo migliore per andare?

Grazie

È stato utile?

Soluzione

Ovviamente questa è una cosa personale, ma non rimuoverei i messaggi di errore.

Se avessi scelto la soluzione semplice, avrei rimosso l'attributo [Richiesto] e aggiunto il codice di convalida al controller per aggiungere l'errore se mancavano le date o impostarle sul valore alternativo se fosse del tipo corretto.

Se stessi cercando la soluzione più complessa, metterei la convalida a livello di modello. Forse una classe base oe un'interfaccia che il modello deve implementare. Una classe ValidationHelper con un metodo Validate (oggetto IValidate) statico che ispezionerà ValidationAttributes e chiamerà un metodo Validate sul modello. Restituirà quindi una raccolta di ValidationErrors. Quindi verrà scritto un ModelBinder personalizzato che comprende la convalida del modello e li associa agli errori ModelState.

Altri suggerimenti

L'approccio seguente aggiorna lo stato del modello e consente di mantenere la progettazione del modello coerente con gli attributi [richiesti] ecc.

Nel mio caso, desidero che il mio modello disponga di un campo obbligatorio che gli utenti di livello normale che utilizzano un'API non possono modificare, quindi l'ho fatto:

ModelState.Remove("ChangeDate");
ModelState.Add("ChangeDate", new ModelState());
ModelState.SetModelValue("ChangeDate", new ValueProviderResult(club.ChangeDate, DateTime.Now.ToString(), null));

In questo modo non è necessario rimuovere i campi richiesti e inoltre non è necessario fornire una data in javascript.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top