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.
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
Wenn Sie diesen Ansatz anwenden, können Sie Validator.TryValidateObject immer noch manuell aufrufen, um es vor dem Senden zu überprüfen. – DaveRead