Question

Actualisation de ModelState

Bonjour, j’ai une question à propos de ModelState dans un contrôleur ASP.NET MVC.

Lorsque l'utilisateur sélectionne une certaine option dans la vue, la date de début et la date de fin pour la "certification". sera défini en fonction des autres dates saisies.

Le problème, c’est que la certification a pour valeur de revenir à zéro et que notre classe CertificationMetaData spécifie les champs comme [Obligatoire] pour que ModelState soit invalide dès le chargement de l’action.

Supprimer les erreurs ModelSate manuellement permet que cela fonctionne, mais je me demandais s’il existe un meilleur moyen de le faire? Est-il possible d'actualiser le ModelState? Dois-je faire les champs non requis? Ou dois-je ajouter une valeur de date de la vue avec 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();
}

Comme vous pouvez le constater, j’ai codé en dur la valeur de l’ID pour le type de certification. Quel est le meilleur moyen de comparer des valeurs avec des valeurs de table de consultation? Une enum est-elle la meilleure solution?

Merci

Était-ce utile?

La solution

Évidemment, c'est une affaire personnelle, mais je ne supprimerais pas les messages d'erreur.

Si je cherchais une solution simple, je supprimerais l’attribut [Obligatoire] et ajouterais un code de validation au contrôleur pour ajouter l’erreur si les dates étaient manquantes ou les définir sur la valeur de remplacement s’il s’agissait du type correct.

Si je visais la solution plus complexe, je mettrais la validation au niveau du modèle. Peut-être une classe de base ou une interface que le modèle doit implémenter. Une classe ValidationHelper avec une méthode statique Validate (objet IValidate) qui inspecte les ValidationAttributes et appelle une méthode Validate sur le modèle. Il renverrait alors une collection de ValidationErrors. Ensuite, un ModelBinder personnalisé sera écrit, qui comprend la validation du modèle et les mappe aux erreurs ModelState.

Autres conseils

L'approche suivante actualise l'état du modèle et vous permet de garder la conception de votre modèle cohérente avec les attributs [requis], etc.

Dans mon cas, je souhaite que mon modèle comporte un champ obligatoire que les utilisateurs de niveau normal utilisant une API ne peuvent pas modifier. Je l'ai donc fait:

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

De cette façon, vous n'avez pas besoin de supprimer vos champs obligatoires ni de fournir une date en javascript.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top