DataAnnotations dynamisch Attribute anfügen
Anscheinend ist es möglich, dynamisch anfügen DataAnnotation-Attribute für Objekt-Eigenschaften zur Laufzeit und als solche erreichen, die dynamische Validierung.
Kann mir jemand code-Beispiel dazu?
InformationsquelleAutor der Frage mare | 2010-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
MVC hat einen Haken, um Ihre eigenen ModelValidatorProvider. Standardmäßig MVC 2 verwendet eine sub-Klasse von ModelValidatorProvider genannt DataAnnotationsModelValidatorProvider, die in der Lage ist zu verwenden System.DataAnnotations.ComponentModel.ValidationAttribute Attribute für die Validierung.
Den DataAnnotationsModelValidatorProvider verwendet reflektion, um zu finden, die alle die ValidationAttributes und einfach Schleifen durch die Sammlung zur Validierung Ihrer Modelle. Alles, was Sie tun müssen, ist das überschreiben einer Methode namens GetValidators und injizieren Ihre eigenen Attribute, egal aus welcher Quelle Sie sich entscheiden. Ich verwende diese Technik zu tun übereinkommen Validierungen, die Eigenschaften mit dem Datentyp.E-Mail-Attribut übergeben bekommt durch einen regex, und verwenden Sie diese Technik zum abrufen von Informationen aus der Datenbank zu gelten restriktivere Prüfungen für "nicht-Leistung" Benutzer.
Folgenden Beispiel einfach sagt "immer machen" FirstName "erforderlichen Eigenschaften":
Alles, was Sie tun müssen ist, registrieren Sie den Anbieter in Ihrer Global.asax.cs-Datei:
Das Ergebnis:
mit diesem Modell:
InformationsquelleAutor der Antwort jfar
In Ihr global.asax, die Sie haben zu klären, die ModelValidatorProviders vor dem hinzufügen der neuen. Sonst wird es fügen Sie jede annotation zwei Zeiten, die Ihnen eine "Validierung geben Sie Namen in dezentem client-Validierung müssen die Regeln eindeutig sein."-Fehler.
InformationsquelleAutor der Antwort Frank Horemans
Ich glaube nicht, können Sie Attribute hinzufügen, um die Mitglieder zur Laufzeit, aber Sie könnte wahrscheinlich verwenden Sie eine benutzerdefinierte Metadaten-Anbieter übernehmen das für Sie.
Sollten Sie sich in diesem blog-post.
InformationsquelleAutor der Antwort Matthew Abbott
Den Ansatz, mithilfe einer benutzerdefinierten
MetadataValidationProvider
mit einer überschriebenenGetValidators
hat ein paar Schwächen:DisplayAttribute
nicht im Zusammenhang mit der Validierung, also dem hinzufügen auf die Validierung der Bühne nicht funktioniert.Wenn Sie möchten, dass Ihre dynamisch-angewandte Daten-Anmerkungen konsequent zu arbeiten, Sie können eine Unterklasse
DataAnnotationsModelMetadataProvider
undDataAnnotationsModelValidatorProvider
. Nachdem Sie dies getan haben, ersetzen das framework diejenigen, überModelMetadataProviders.Current
undModelValidatorProviders.Providers
bei Anwendung start-up. (Sie könnten es tun, inApplication_Start
.)Wenn Sie eine Unterklasse der integrierte Anbieter, die eine systematische und hoffentlich zukunftssicheren Weg, um Ihre eigenen Attribute zu überschreiben
GetTypeDescriptor
. Ich habe dies erfolgreich, aber es beinhaltete die Schaffung einer Umsetzung vonICustomTypeDescriptor
undPropertyDescriptor
, die viel code und Zeit.InformationsquelleAutor der Antwort Sam