109 votes

ASP.NET MVC: Validation personnalisée par DataAnnotation

J'ai un modèle avec 4 propriétés qui sont de type chaîne. Je sais que vous pouvez valider la longueur d'une propriété unique en utilisant l'annotation StringLength. Cependant, je veux valider la longueur des 4 propriétés combinées.

Quelle est la méthode MVC pour ce faire avec l'annotation de données?

Je pose la question parce que je suis nouveau chez MVC et que je veux le faire correctement avant de créer ma propre solution.

172voto

Darin Dimitrov Points 528142

Vous pouvez écrire un attribut de validation personnalisé:

 public class CombinedMinLengthAttribute: ValidationAttribute
{
    public CombinedMinLengthAttribute(int minLength, params string[] propertyNames)
    {
        this.PropertyNames = propertyNames;
        this.MinLength = minLength;
    }

    public string[] PropertyNames { get; private set; }
    public int MinLength { get; private set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty);
        var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType<string>();
        var totalLength = values.Sum(x => x.Length) + Convert.ToString(value).Length;
        if (totalLength < this.MinLength)
        {
            return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
        }
        return null;
    }
}
 

et alors vous pourriez avoir un modèle de vue et décorer une de ses propriétés avec elle:

 public class MyViewModel
{
    [CombinedMinLength(20, "Bar", "Baz", ErrorMessage = "The combined minimum length of the Foo, Bar and Baz properties should be longer than 20")]
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Baz { get; set; }
}
 

92voto

Andrei Mikhalevich Points 6372

Vous pouvez utiliser l' auto-validation :

Implémentez une interface IValidatableObject avec la méthode Validate , où vous pouvez mettre votre code de validation.

 public class TestModel : IValidatableObject
{
    public string Title { get; set; }
    public string Description { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Title == null)
        {
            yield return new ValidationResult("The title is mandatory.", new [] { "Title" });
        }
        if (Description == null)
        {
            yield return new ValidationResult("The description is mandatory.", new [] { "Description" });
        }
    }
}
 

Veuillez noter que ceci n’est qu’une validation côté serveur.

24voto

Jaroslaw Waliszko Points 6618

ExpressiveAnnotations vous offre une telle possibilité:

 [Required]
[AssertThat("Length(FieldA) + Length(FieldB) + Length(FieldC) + Length(FieldD) > 50")]
public string FieldA { get; set; }
 

9voto

Yasser Points 9307

Arrière-plan:

Modèle de validations sont nécessaires pour assurer que les données reçues que nous recevons est valide et correct afin que nous puissions faire le traitement de ces données. On peut valider un modèle dans une méthode d'action. Les attributs de validation intégrés sont à Comparer, Plage, RegularExpression, Requis, StringLength. Cependant, nous pouvons avoir des scénarios où nous avons exigé de la validation des attributs autres que le construit en.

Personnalisé Attributs De Validation

public class EmployeeModel 
{
    [Required]
    [UniqueEmailAddress]
    public string EmailAddress {get;set;}
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public int OrganizationId {get;set;}
}

Pour créer un attribut validation, vous aurez à dériver cette classe de ValidationAttribute.

public class UniqueEmailAddress : ValidationAttribute
{
    private IEmployeeRepository _employeeRepository;
    [Inject]
    public IEmployeeRepository EmployeeRepository
    {
        get { return _employeeRepository; }
        set
        {
            _employeeRepository = value;
        }
    }
    protected override ValidationResult IsValid(object value,
                        ValidationContext validationContext)
    {
        var model = (EmployeeModel)validationContext.ObjectInstance;
        if(model.Field1 == null){
            return new ValidationResult("Field1 is null");
        }
        if(model.Field2 == null){
            return new ValidationResult("Field2 is null");
        }
        if(model.Field3 == null){
            return new ValidationResult("Field3 is null");
        }
        return ValidationResult.Success;
    }
}

Espérons que cette aide. Cheers !

Références

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X