Validation de formulaire MVC sur plusieurs champs

Comment devrais-je avoir plusieurs zones de texte sur un formulaire MVC 3 traitées comme une pour les besoins de la validation?

C’est un simple champ de numéro de téléphone avec une zone de texte pour l’indicatif régional, une pour le préfixe et une pour les quatre derniers chiffres.

Il y a vraiment deux conditions de validation:

1) Ils sont tous nécessaires. 2) Ils doivent tous contenir des entiers.

Maintenant, c’est simple lorsque vous le faites pour des champs individuels, mais comment puis-je créer l’équivalent d’un ASP.NET CustomValidator avec MVC afin de valider les trois champs dans leur ensemble?

En fait, j’ai fini par implémenter un ValidationAtsortingbute personnalisé pour résoudre ce problème, en utilisant le même type de logique que celui présenté dans CompareAtsortingbute qui vous permet d’utiliser la reflection pour évaluer les valeurs d’autres propriétés. Cela m’a permis de l’implémenter au niveau de la propriété au lieu du niveau du modèle et permet également la validation côté client via javascript non intrusif:

 public class MultiFieldRequiredAtsortingbute : ValidationAtsortingbute, IClientValidatable { private readonly ssortingng[] _fields; public MultiFieldRequiredAtsortingbute(ssortingng[] fields) { _fields = fields; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { foreach (ssortingng field in _fields) { PropertyInfo property = validationContext.ObjectType.GetProperty(field); if (property == null) return new ValidationResult(ssortingng.Format("Property '{0}' is undefined.", field)); var fieldValue = property.GetValue(validationContext.ObjectInstance, null); if (fieldValue == null || Ssortingng.IsNullOrEmpty(fieldValue.ToSsortingng())) return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); } return null; } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { yield return new ModelClientValidationRule { ErrorMessage = this.ErrorMessage, ValidationType = "multifield" }; } } 

Vous pouvez gérer cela en plaçant IValidatableObject sur la classe de modèle et en implémentant la méthode Validate .

Cela pourrait ressembler à quelque chose comme ça:

 public IEnumerable Validate(ValidationContext validationContext) { if (Ssortingng.IsNullOrEmpty(_PhonePart1) || Ssortingng.IsNullOrEmpty(_PhonePart2) || Ssortingng.IsNullOrEmpty(_PhonePart3)) { yield return new ValidationResult("You must enter all " + "three parts of the number."); } } 

Scott, L’utilisation d’un classeur de modèles personnalisé fait-elle partie de votre champ d’application? Si tel est le cas, vous pouvez implémenter un IModelBinder pour combiner les résultats des trois champs de texte en un seul champ de numéro de téléphone, qui peut être décoré avec des atsortingbuts de validation. Voici une question de stackoverflow qui présente un exemple de procédure à suivre: Validations DataAnnotation et Custom ModelBinder