Ich verstehe, dass dies IValidatableObject
verwendet wird, um ein Objekt so zu validieren, dass man Eigenschaften miteinander vergleichen kann.
Ich hätte gerne noch Attribute zum Überprüfen einzelner Eigenschaften, möchte aber in bestimmten Fällen Fehler bei einigen Eigenschaften ignorieren.
Versuche ich es im folgenden Fall falsch zu verwenden? Wenn nicht, wie implementiere ich das?
public class ValidateMe : IValidatableObject
{
[Required]
public bool Enable { get; set; }
[Range(1, 5)]
public int Prop1 { get; set; }
[Range(1, 5)]
public int Prop2 { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!this.Enable)
{
/* Return valid result here.
* I don't care if Prop1 and Prop2 are out of range
* if the whole object is not "enabled"
*/
}
else
{
/* Check if Prop1 and Prop2 meet their range requirements here
* and return accordingly.
*/
}
}
}
Zitat aus Jeff Handleys Blogpost zu Validierungsobjekten und -eigenschaften mit Validator :
Dies weist darauf hin, dass das, was Sie versuchen, nicht sofort funktioniert, da die Validierung in Schritt 2 abgebrochen wird. Sie können versuchen, Attribute zu erstellen, die von den integrierten Attributen erben, und insbesondere das Vorhandensein einer aktivierten Eigenschaft (über eine Schnittstelle) überprüfen, bevor Sie deren normale Validierung durchführen. Alternativ können Sie die gesamte Logik zur Validierung der Entität in die
Validate
Methode einfügen.quelle
Nur um ein paar Punkte hinzuzufügen:
Da die
Validate()
Methodensignatur zurückgegebenIEnumerable<>
wird,yield return
können damit die Ergebnisse träge generiert werden. Dies ist von Vorteil, wenn einige der Validierungsprüfungen E / A- oder CPU-intensiv sind.Wenn Sie verwenden
MVC ModelState
, können Sie die Fehler des ValidierungsergebnissesModelState
wie folgt in Einträge konvertieren (dies kann hilfreich sein, wenn Sie die Validierung in einem benutzerdefinierten Modellordner durchführen ):quelle
Ich habe eine abstrakte Klasse für die allgemeine Verwendung zur Validierung implementiert
quelle
Das Problem mit der akzeptierten Antwort besteht darin, dass es jetzt vom Aufrufer abhängt, ob das Objekt ordnungsgemäß validiert wird. Ich würde entweder das RangeAttribute entfernen und die Bereichsüberprüfung innerhalb der Validate-Methode durchführen, oder ich würde eine benutzerdefinierte Attributunterklasse RangeAttribute erstellen, die den Namen der erforderlichen Eigenschaft als Argument für den Konstruktor verwendet.
Beispielsweise:
quelle
Ich mochte die Antwort von cocogza mit der Ausnahme, dass das Aufrufen von base.IsValid zu einer Stapelüberlaufausnahme führte, da die IsValid-Methode immer wieder neu eingegeben wurde. Deshalb habe ich es für eine bestimmte Art der Validierung geändert, in meinem Fall für eine E-Mail-Adresse.
Das funktioniert viel besser! Es stürzt nicht ab und erzeugt eine nette Fehlermeldung. Hoffe das hilft jemandem!
quelle
Das, was ich an iValidate nicht mag, ist, dass es nur nach allen anderen Überprüfungen ausgeführt wird.
Zumindest auf unserer Website würde es außerdem während eines Sicherungsversuchs erneut ausgeführt. Ich würde vorschlagen, dass Sie einfach eine Funktion erstellen und Ihren gesamten Validierungscode darin platzieren. Alternativ können Sie für Websites Ihre "spezielle" Validierung im Controller haben, nachdem das Modell erstellt wurde. Beispiel:
quelle