Thomas Bandt

Über mich | Kontakt | Archiv

ASP.NET MVC 2 - Data Annotations und der (Passwort-) Vergleich

UPDATE

Ein Standard-Fall im Web ist die Eingabe von Passwörtern für Registrierungs-Formulare. Damit man auch (weitestgehend) sicherstellt, dass das eingegebene Passwort keine unbeabsichtigten Tippfehler enthält, lässt man es den Nutzer üblicherweise einfach doppelt eingeben - und vergleicht das Ergebnis dann bei der Überprüfung. Hat er zweimal das gleiche Passwort eingegeben, ist alles in Ordnung.

Die vorhandenen Attribute sehen diesen Fall aber leider nicht vor, weshalb man sich sein eigenes Attribut schreiben muss. Lange Rede, kurzer Sinn, hier ist es:

   1:  public class SignUpViewModel
   2:  {
   3:      [DisplayName("Passwort")]
   4:      [DataType(DataType.Password)]
   5:      [Required(ErrorMessage = "Bitte geben Sie ein Passwort an an")]
   6:      public string UserPassword { get; set; }
   7:   
   8:      [DisplayName("Passwort (Wiederholung)")]
   9:      [DataType(DataType.Password)]
  10:      [PropertiesMatch(PropertyToCompareWith = "UserPassword", 
  11:          ErrorMessage = "Bitte wiederholen Sie Ihr Passwort korrekt")]
  12:      public string UserPasswordConfirmation { get; set; }
  13:  }

   1:  public class PropertiesMatchAttribute : ValidationAttribute
   2:  {
   3:   
   4:      public string PropertyToCompareWith { get; set; }
   5:   
   6:      protected override ValidationResult IsValid(object value, 
   7:          ValidationContext validationContext)
   8:      {
   9:   
  10:          var property = validationContext.ObjectInstance.GetType().
  11:                              GetProperty(PropertyToCompareWith);
  12:          var valueToCompareWith = property.GetValue(validationContext.ObjectInstance, null);
  13:          var isValid = valueToCompareWith == value;
  14:   
  15:          if (isValid)
  16:              return ValidationResult.Success;
  17:   
  18:          return new ValidationResult(ErrorMessage, new[] { validationContext.MemberName });
  19:   
  20:      }
  21:   
  22:  }

Dass es funktioniert, lässt sich natürlich auch testen:

   1:  [TestMethod]
   2:  public void Das_wiederholte_Passwort_darf_nicht_vom_Passwort_abweichen()
   3:  {
   4:      var sut = new SignUpViewModel { UserPassword = "password1", 
   5:          UserPasswordConfirmation = "password2" };
   6:      var validationResults = new ValidationResults();
   7:      Validator.TryValidateObject(sut, new ValidationContext(sut, null, null), 
   8:          validationResults, true);
   9:      Assert.IsTrue(validationResults.ContainsField<SignUpViewModel>
  10:          (m => m.UserPasswordConfirmation));
  11:  }
  12:   
  13:  [TestMethod]
  14:  public void Das_wiederholte_Passwort_muss_mit_dem_Passwort_übereinstimmen()
  15:  {
  16:      var sut = new SignUpViewModel { UserPassword = "password1", 
  17:          UserPasswordConfirmation = "password1" };
  18:      var validationResults = new ValidationResults();
  19:      Validator.TryValidateObject(sut, new ValidationContext(sut, null, null), 
  20:          validationResults, true);
  21:      Assert.IsFalse(validationResults.ContainsField<SignUpViewModel>
  22:          (m => m.UserPasswordConfirmation));
  23:  }

 

Kommentare

  1. Thomas goes .NET schrieb am Mittwoch, 17. Februar 2010 13:04:00 Uhr:

    Da habe ich mich gestern lang und breit damit beschäftigt, wie man


« Zurück  |  Weiter »