2012-04-12 7 views
1

Ich verwende Validator.TryValidateObject(), um ein Objekt zu validieren, das Datenannotationen verwendet. Wenn das Objekt ungültig ist, wird der Code ordnungsgemäß ausgeführt. Wenn es jedoch gültig ist, wird ein Stackoverflow-Fehler erzeugt.StackOverflow mit TryValidateObject, wenn das Objekt gültig ist

Hier ist meine Methode:

public virtual IEnumerable<ValidationResult> Validate(ValidationContext vc) 
{ 
    vc = new ValidationContext(this, null, null); 
    List<ValidationResult> a = new List<ValidationResult>(); 

    Validator.TryValidateObject(this, vc, a,true); 

    foreach (var item in a) 
     yield return item; 

    if (Name == "Arbitary") 
     yield return new ValidationResult("Bad Name.", new[] { "Name" }); 

} 

Es scheint, dass TryValidateObject intern meine Methode ruft Validate auch.

Mein Ziel mit dieser Methode ist, alle DataAnnotations für mein Objekt zu validieren und anschließend eine komplexe Validierungslogik hinzuzufügen - also nahm ich an, dass TryValidateObject Datenanmerkungen überprüfen würde, danach konnte ich meine eigene Validierungslogik platzieren.

So funktioniert meine Methode, wenn die Daten ungültig sind - es wird die ValidationResults aus den DataAnnotations melden, und auch ein ValidationResult wenn der Name "Arbitary" ist, aber ich bekomme diesen Stackoverflow, wenn die Daten gültig sind .

Irgendwelche Ideen? Wie kann ich die Datenanmerkungen meines Objekts so validieren, dass meine eigene Validate-Methode nicht aufgerufen wird? Alternativ: Wie löse ich diesen Stack-Überlauf auf?

Beachten Sie, dass meine Klasse die IValidatableObject Schnittstelle implementiert.

Antwort

2

Anstatt von Validate zu erben, könnten Sie Ihr eigenes Datenanmerkungsattribut implementieren, um eine benutzerdefinierte Validierung gemäß dieser SO-Frage durchzuführen?

How to create Custom Data Annotation Validators

+1

Danke, ich dies tun kann, aber ich möchte in der Lage sein, herauszufinden, ob mein Objekt, bevor Sie in die Datenbank aufgenommen werden, um sie zu retten: so etwas wie 'if (Model.Validate(). Count() == 0) {Database.Save (Model);} '. Im Moment muss ich eine Ausnahme "fangen", wenn ich versuche, 'Save()' in der Datenbank zu speichern, was furchtbar ineffizient ist. – Oliver

+1

Wenn Sie diesen Ansatz anwenden, können Sie Validator.TryValidateObject immer noch manuell aufrufen, um es vor dem Senden zu überprüfen. – DaveRead