ASP.NET MVC 3 Validation et IValidatableObject

Une des nouveautés apparue sous ASP.NET MVC 3 est l’interface IValidatableObject. Grâce à cette interface, il nous est possible d’intégrer des clauses de validation beaucoup plus poussées. Celle-ci nous permet de remplacer la validation dans la déclaration de nos modèles, et évite l’utilisation de la méthode ModelState.AddModelError.

Voici le modèle de base que nous allons utiliser pour notre exemple:

1
2
3
4
5
6
7
8
9
public class Personne {
 
    public long PersonneId { get; set; }
 
    [Display(Name = "Email", ResourceType = typeof(Resources.Validation))]
    [Required(ErrorMessageResourceName = "Required", 
        ErrorMessageResourceType = typeof(Resources.Validation))]
    public string Email { get; set; }
}

Implémentation de l’interface

L’implémentation de l’interface IValidatableObject passe par l’implémentation de la méthode Validate. Voici comment nous procédons pour vérifier l’unicité de l’email:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Personne : IValidatableObject {
 
    public long PersonneId { get; set; }
 
    [Display(Name = "Email", ResourceType = typeof(Resources.Validation))]
    [Required(ErrorMessageResourceName = "Required", 
        ErrorMessageResourceType = typeof(Resources.Validation))]
    public string Email { get; set; }
 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
 
        PersonneManager manager = new PersonneManager());
 
        if (manager.Exists(this.Email))
            yield return new ValidationResult(Resources.Validation.EmailDejaUtilise, 
                new string[] { "Email" });
    }
}

Grâce à ce code, nous retournons une erreur de validation si l’email existe déjà dans notre base de données, et nous appliquons « ValidationResult » à notre propriété « Email ». De cette façon, nous aurons un message d’erreur appliqué sur notre input:
email validation