Thomas Bandt

Über mich | Kontakt | Archiv

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

Da habe ich mich gestern lang und breit damit beschäftigt, wie man das Problem auf Property-Basis lösen kann, dann das. Das gezeigte Beispiel funktioniert zwar in der Theorie - und auch in den Tests - nur in der Praxis fällt es durch. Problem: "validationContext" ist null. Immer.

Ich stecke noch nicht so tief drin, als das ich wüsste, warum Microsoft das nicht implementiert hat - aber da wir ja von einem Release Candidate sprechen, nehme ich mal an, dass sich da in absehbarer Zeit auch nichts tun wird.

Nach einiger Suche, Flüchen und 2, 3 grauen Haaren bin ich dann auf eine Lösung direkt vor meiner Nase gestoßen. Microsoft liefert in den Projekt-Templates für MVC2 in Visual Studio bereits eine Klasse namens "PropertiesMustMatchAttribute" mit. Der Name ist selbsterklärend:

   1:  [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, 
   2:      Inherited = true)]
   3:  public sealed class PropertiesMustMatchAttribute : 
   4:      ValidationAttribute
   5:  {
   6:      private const string _defaultErrorMessage = 
   7:          "'{0}' and '{1}' do not match.";
   8:      private readonly object _typeId = new object();
   9:   
  10:      public PropertiesMustMatchAttribute(string originalProperty, 
  11:          string confirmProperty)
  12:          : base(_defaultErrorMessage)
  13:      {
  14:          OriginalProperty = originalProperty;
  15:          ConfirmProperty = confirmProperty;
  16:      }
  17:   
  18:      public string ConfirmProperty { get; private set; }
  19:      public string OriginalProperty { get; private set; }
  20:   
  21:      public override object TypeId
  22:      {
  23:          get { return _typeId; }
  24:      }
  25:   
  26:      public override string FormatErrorMessage(string name)
  27:      {
  28:          return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
  29:              OriginalProperty, ConfirmProperty);
  30:      }
  31:   
  32:      public override bool IsValid(object value)
  33:      {
  34:          PropertyDescriptorCollection properties = 
  35:              TypeDescriptor.GetProperties(value);
  36:          object originalValue = 
  37:              properties.Find(OriginalProperty, true).GetValue(value);
  38:          object confirmValue = 
  39:              properties.Find(ConfirmProperty, true).GetValue(value);
  40:          return Object.Equals(originalValue, confirmValue);
  41:      }
  42:  }

Es funktioniert übrigens auch prima - auch wenn die Überprüfung erst nach denen der Properties ausgeführt wird, also ganz zum Schluss. Aber damit kann ich leben.

Kommentare

  1. Thomas goes .NET schrieb am Samstag, 15. Mai 2010 11:05:00 Uhr:

    Ich habe mich zwar schon vor einiger Zeit von der Verwendung der DataAnnotations in meinen ernsthaften Projekten wieder verabschiedet, doch habe ich just diese Woche erst wieder ein kleineres Projekt damit umgesetzt (man glaubt ja gar nicht wie effiz ...


« Zurück  |  Weiter »