Heim >Backend-Entwicklung >C++ >So implementieren Sie eine bedingte Validierung in IvalIdatableObject mit Attributen auf Eigenschaftenebene und szenariobasiertem Ignorieren?
<:> Frage:
Ich weiß, dass beim Vergleich der Attribute zur Objektüberprüfung verwendet werden kann. Ich hoffe jedoch, Attribute zu verwenden, um ein einzelnes Attribut zu überprüfen und bestimmte Attribute in einigen Szenarien zu ignorieren. Ist meine Implementierung unten falsch?
Antwort: IValidatableObject
<code class="language-csharp">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) { // 在此处返回有效结果。 // 如果整个对象未“启用”,我不关心 Prop1 和 Prop2 是否超出范围 } else { // 在此处检查 Prop1 和 Prop2 是否满足其范围要求 // 并相应地返回。 } } }</code>bereitgestellte Implementierung kann verbessert werden, um die erforderlichen Bedingungen umzusetzen. Das Folgende ist eine alternative Methode:
verwendet , nur wenn die Überprüfung fehlschlägt, wird das Überprüfungsergebnis zur
-Kollektion hinzugefügt. Wenn die Überprüfung erfolgreich ist, wird sie nicht hinzugefügt, was Erfolg bedeutet.Ausführungsüberprüfung:
<code class="language-csharp">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) { var results = new List<ValidationResult>(); if (this.Enable) { Validator.TryValidateProperty(this.Prop1, new ValidationContext(this, null, null) { MemberName = "Prop1" }, results); Validator.TryValidateProperty(this.Prop2, new ValidationContext(this, null, null) { MemberName = "Prop2" }, results); // 其他一些随机测试 if (this.Prop1 > this.Prop2) { results.Add(new ValidationResult("Prop1 必须大于 Prop2")); } } return results; } }</code>
Validator.TryValidateProperty()
setzen Sie auf results
, um sicherzustellen, dass nur die Attribute von
Methoden überprüft werden können.
<code class="language-csharp">public void DoValidation() { var toValidate = new ValidateMe() { Enable = true, Prop1 = 1, Prop2 = 2 }; bool validateAllProperties = false; var results = new List<ValidationResult>(); bool isValid = Validator.TryValidateObject( toValidate, new ValidationContext(toValidate, null, null), results, validateAllProperties); }</code>Diese überarbeitete Antwort verwaltet das Originalbild und liefert eine prägnantere und genauere Erklärung des Codebeispiels, wobei sich die wichtigsten Verbesserungen konzentrieren und den Zweck von
klassifizieren. Die Codeblöcke sind auch für eine bessere Lesbarkeit formatiert >
Das obige ist der detaillierte Inhalt vonSo implementieren Sie eine bedingte Validierung in IvalIdatableObject mit Attributen auf Eigenschaftenebene und szenariobasiertem Ignorieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!