ASP MVC: atsortingbut de validation personnalisé

J’essaie d’écrire mon propre atsortingbut de validation personnalisée, mais je rencontre des problèmes.

L’atsortingbut que j’essaie d’écrire est que lorsqu’un utilisateur se connecte, le mot de passe sera comparé au mot de passe de confirmation.

namespace Data.Atsortingbutes { public class ComparePassword : ValidationAtsortingbute { public ssortingng PasswordToCompareWith { get; set; } public override bool IsValid(object value) { if (PasswordToCompareWith == (ssortingng)value) { return true; } return false; } } 

Maintenant, mon problème est quand j’essaye de définir l’atsortingbut comme ceci dans le fichier de modèle:

  [Required] [ComparePassword(PasswordToCompareWith=ConfirmPassword)] public ssortingng Password { get; set; } [Required] public ssortingng ConfirmPassword { get; set; } } 

Je reçois l’erreur suivante:

Erreur 1 Une référence d’object est requirejse pour le champ, la méthode ou la propriété non statique ‘Project.Data.Models.GebruikerRegistreerModel.ConfirmPassword.get’.

Il semble que VS n’accepte pas le confirmpassword de PasswordToCompareWith=ConfirmPassword confirmpassword dans la partie PasswordToCompareWith=ConfirmPassword .

Qu’est-ce que je fais mal?

Désolé de vous décevoir, mais gérer un cas aussi simple que le vôtre à l’aide d’annotations de données peut être pénible. Vous pouvez jeter un oeil à ce post .

Selon ce lien http://devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-1 , un atsortingbut de validation spécial est maintenant présent dans MVC3:

 public class RegisterModel { // skipped [Required] [ValidatePasswordLength] [DataType(DataType.Password)] [Display(Name = "Password")] public ssortingng Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation do not match.")] public ssortingng ConfirmPassword { get; set; } } 

CompareAtsortingbute est un nouveau validateur très utile qui ne fait pas partie de System.ComponentModel.DataAnnotations, mais qui a été ajouté à la DLL System.Web.Mvc par l’équipe. Bien que son nom ne soit pas très bien nommé (la seule comparaison qu’il fait est de vérifier l’égalité, alors EqualTo serait peut-être plus évident), il est facile de voir dans l’utilisation que ce validateur vérifie que la valeur d’une propriété est égale à celle d’une autre propriété. . Vous pouvez voir dans le code que l’atsortingbut prend une propriété de chaîne qui est le nom de l’autre propriété que vous comparez. L’utilisation classique de ce type de validateur correspond à l’utilisation que nous en faisons ici: confirmation du mot de passe.

FoolProof http://foolproof.codeplex.com/ semble être la meilleure solution.

 public class SignUpViewModel { [Required] public ssortingng Password { get; set; } [EqualTo("Password", ErrorMessage="Passwords do not match.")] public ssortingng RetypePassword { get; set; } } 

C’est mieux que suggéré, PropertiesMustMatchAtsortingbute, car il ajoute l’erreur de validation pour “RetypePassword” au lieu du niveau de modèle global, comme le fait PropertiesMustMatchAtsortingbute.

Je ne sais pas pourquoi c’est fait pour être si gros, faites ceci:

 [AtsortingbuteUsage(AtsortingbuteTargets.Property, AllowMultiple = true, Inherited = false)] public class ComparePassword: ValidationAtsortingbute { public ComparePassword() : base("Passwords must match.") { } protected override ValidationResult IsValid (object value, ValidationContext validationContext) { if (value == null) return new ValidationResult("A password is required."); // Make sure you change YourRegistrationModel to whatever the actual name is if ((validationContext.ObjectType.Name != "YourRegistrationModel") return new ValidationResult("This atsortingbute is being used incorrectly."); if (((YourRegistrationModel)validationContext.ObjectInstance).ConfirmPassword != value.ToSsortingng()) return new ValidationResult("Passwords must match."); return ValidationResult.Success; } } 

Il ne vous rest plus [ComparePassword] append [ComparePassword] à votre propriété de mot de passe, rien à passer … simple et assez propre

Vous ne pouvez pas passer un type de référence à un atsortingbut à moins de faire un code de reflection plutôt boiteux.

Dans ce cas, je pense que la création d’un classeur de modèle personnalisé serait une meilleure idée, puis la vérification du mot de passe et de ComparePassword à ce stade.

vous avez besoin d’une méthode STATIC dans votre cas: EXEMPLE:

  public static ValidationResult ValidateFrequency( double frequency, ValidationContext context ) { if( context == null ) { return ( ValidationResult.Success ); } } 

juste à titre d’exemple:

  using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Globalization; using System.Web.Mvc; using System.Web.Security; namespace GDNET.Web.Mvc.Validation { [AtsortingbuteUsage(AtsortingbuteTargets.Field | AtsortingbuteTargets.Property, AllowMultiple = false, Inherited = true)] public sealed class ValidatePasswordLengthAtsortingbute : ValidationAtsortingbute, IClientValidatable { private const ssortingng defaultErrorMessage = "'{0}' must be at least {1} characters long."; private readonly int minRequiredPasswordLength = Membership.Provider.MinRequiredPasswordLength; public ValidatePasswordLengthAtsortingbute() : base(defaultErrorMessage) { } public override ssortingng FormatErrorMessage(ssortingng name) { return Ssortingng.Format(CultureInfo.CurrentCulture, ErrorMessageSsortingng, name, minRequiredPasswordLength); } public override bool IsValid(object value) { ssortingng valueAsSsortingng = value as ssortingng; return (valueAsSsortingng != null && valueAsSsortingng.Length >= minRequiredPasswordLength); } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { return new[] { new ModelClientValidationSsortingngLengthRule(FormatErrorMessage(metadata.GetDisplayName()), minRequiredPasswordLength, int.MaxValue) }; } } } 

source: https://code.google.com/p/gdnetprojects/source/browse/trunk/Experiments/Common/GDNET.Web.Mvc/Validation/ValidatePasswordLengthAtsortingbute.cs?r=69