web-dev-qa-db-fra.com

Data Annotation pour valider le mot de passe de confirmation

Le modèle My User contient les annotations de données suivantes pour valider les champs de saisie:

[Required(ErrorMessage = "Username is required")]
[StringLength(16, ErrorMessage = "Must be between 3 and 16 characters", MinimumLength = 3)]
public string Username { get; set; }

[Required(ErrorMessage = "Email is required"]
[StringLength(16, ErrorMessage = "Must be between 5 and 50 characters", MinimumLength = 5)]
[RegularExpression("^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$", ErrorMessage = "Must be a valid email")]
public string Email { get; set; }

[Required(ErrorMessage = "Password is required"]
[StringLength(255, ErrorMessage = "Must be between 5 and 255 characters", MinimumLength = 5)]
public string Password { get; set; }

[Required(ErrorMessage = "Confirm Password is required"]
[StringLength(255, ErrorMessage = "Must be between 5 and 255 characters", MinimumLength = 5)]
public string ConfirmPassword { get; set; }

Cependant, je ne parviens pas à comprendre comment confirmer que le mot de passe est identique à Mot de passe. Autant que je sache, seules ces routines de validation existent: Required, StringLength, Range, RegularExpression.

Que puis-je faire ici? Merci.

44
James Dawson

Si vous utilisez ASP.Net MVC 3, vous pouvez utiliser System.Web.Mvc.CompareAttribute.

Si vous utilisez ASP.Net 4.5, c'est dans le System.Component.DataAnnotations.

[Required(ErrorMessage = "Password is required")]
[StringLength(255, ErrorMessage = "Must be between 5 and 255 characters", MinimumLength = 5)]
[DataType(DataType.Password)]
public string Password { get; set; }

[Required(ErrorMessage = "Confirm Password is required")]
[StringLength(255, ErrorMessage = "Must be between 5 and 255 characters", MinimumLength = 5)]
[DataType(DataType.Password)]
[Compare("Password")]
public string ConfirmPassword { get; set; }

EDIT: Pour MVC2 Utilisez la logique ci-dessous, utilisez PropertiesMustMatch à la place de l'attribut Compare [Le code ci-dessous est copié à partir du modèle de projet MVCApplication par défaut.]

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public sealed class PropertiesMustMatchAttribute : ValidationAttribute
{
    private const string _defaultErrorMessage = "'{0}' and '{1}' do not match.";
    private readonly object _typeId = new object();

    public PropertiesMustMatchAttribute(string originalProperty, string confirmProperty)
        : base(_defaultErrorMessage)
    {
        OriginalProperty = originalProperty;
        ConfirmProperty = confirmProperty;
    }

    public string ConfirmProperty { get; private set; }
    public string OriginalProperty { get; private set; }

    public override object TypeId
    {
        get
        {
            return _typeId;
        }
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
            OriginalProperty, ConfirmProperty);
    }

    public override bool IsValid(object value)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
        object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value);
        object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value);
        return Object.Equals(originalValue, confirmValue);
    }
}
96

D'autres annotations de données sont facultatives. Vous pouvez les ajouter en fonction de vos besoins, mais vous devez le faire pour implémenter l'opération de comparaison de mot de passe 

[Required]
[DataType(DataType.Password)]
public string Password { get; set; }

[Required]
[DataType(DataType.Password)]`enter code here`
[Compare("Password")]
public string ConfirmPassword { get; set; }
0
Khursand Kousar

Vous pouvez utiliser l'annotation de comparaison pour comparer deux valeurs, et si vous devez vous assurer qu'elle n'est pas persistante en aval (par exemple, si vous utilisez EF), vous pouvez également ajouter NotMapped pour ignorer toute correspondance entité-> DB.

Pour une liste complète des annotations de données disponibles, voir ici:

https://msdn.Microsoft.com/en-us/library/system.componentmodel.dataannotations(v=vs.110).aspx

[Required]
[DataType(DataType.Password)]
public string Password { get; set; }

[Required]
[DataType(DataType.Password)]
[Compare("Password")]
[NotMapped]
public string ConfirmPassword { get; set; }
0
Mahadi Hasan