Ich kann Ihr Dilemma verstehen. Ich bin auf der Suche nach anderen Validierungslösungen, auch im Hinblick auf komplexe Validierungsregeln, die für mehr als eine Eigenschaft eines bestimmten Modellobjekts oder sogar für viele Eigenschaften von verschiedenen Modellobjekten in einem Objektgraphen gelten könnten (wenn Sie das Pech haben, verknüpfte Objekte wie diese zu validieren).
Die Begrenzung der IDataErrorInfo
Schnittstelle ist, dass ein Modellobjekt den gültigen Zustand einfach dann erfüllt, wenn keine der Eigenschaften Fehler aufweist. Dies bedeutet, dass ein gültig Objekt ist eines, bei dem alle seine Eigenschaften auch gültig . Allerdings kann ich eine Situation haben, wo, wenn Eigenschaft A, B und C gültig sind - dann das gesamte Objekt gültig ist. sondern auch wenn Eigenschaft A nicht gültig ist, aber B y C sind, dann erfüllt das Objekt die Gültigkeit. Ich habe einfach keine Möglichkeit, diese Bedingung/Regel mit dem IDataErrorInfo
Schnittstelle / DataAnnotations
Attribute.
So fand ich dies Delegiertenansatz . Viele der hilfreichen Weiterentwicklungen in MVC gab es zum Zeitpunkt der Erstellung dieses Artikels noch nicht, aber das Kernkonzept sollte Ihnen helfen. Anstatt Attribute zu verwenden, um die Validierungsbedingungen eines Objekts zu definieren, erstellen wir delegierte Funktionen, die komplexere Anforderungen validieren, und da sie delegiert sind, können wir sie wiederverwenden. Sicherlich ist es mehr Arbeit, aber die Verwendung von Delegaten bedeutet, dass wir in der Lage sein sollten, den Validierungsregelcode einmal zu schreiben y alle Validierungsregeln an einem Ort zu speichern (vielleicht in der Dienstschicht) y (das coole Teil) verwenden sogar die MVC 2 DefaultModelBinder
um die Validierung automatisch aufzurufen (ohne haufenweise Überprüfungen in unseren Controller-Aktionen - wie in Scotts Blog beschrieben, können wir das mit DataAnnotations
. Siehe dazu die letzter Absatz vor der Überschrift 'Strongly Typed UI Helpers')!
Ich bin sicher, Sie können den im obigen Artikel vorgeschlagenen Ansatz mit anonymen Delegierten wie Func<T>
o Predicate<T>
und das Schreiben von benutzerdefinierten Codeblöcken für die Validierungsregeln ermöglicht eigenschaftsübergreifende Bedingungen (z. B. die von Ihnen erwähnte Bedingung, wenn Ihre ShippingSameAsBilling
Eigenschaft wahr ist, können Sie weitere Regeln für die Lieferadresse usw. ignorieren.)
DataAnnotations
dient dazu, einfache Validierungsregeln für Objekte aufzustellen wirklich einfach mit sehr wenig Code. Wenn sich Ihre Anforderungen weiterentwickeln, werden Sie jedoch komplexere Regeln validieren müssen. Die neuen virtuellen Methoden im MVC2-Modellbinder sollten uns weiterhin Möglichkeiten bieten, unsere zukünftigen Validierungserfindungen in das MVC-Framework zu integrieren.