"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > IvalidatableObject 조건 검증을 구현하십시오. 속성 레벨 및 시나리오 무지

IvalidatableObject 조건 검증을 구현하십시오. 속성 레벨 및 시나리오 무지

2025-04-16에 게시되었습니다
검색:398

How to Implement Conditional Validation in IValidatableObject with Property-Level Attributes and Scenario-Based Ignoring?

질문:

나는 ivalidableObject 를 사용하여 속성을 비교할 때 객체 검증을 수행 할 수 있다는 것을 알고 있습니다. 그러나 속성을 사용하여 단일 속성을 검증하고 일부 시나리오에서 특정 속성을 무시하는 시나리오가 실패하고 싶습니다. 다음 구현이 틀렸습니까?

public class validAteme : ivalidatableObject { [필수의] Public Bool 활성화 {get; 세트; } [범위 (1, 5)] 공개 int prop1 {get; 세트; } [범위 (1, 5)] 공개 int prop2 {get; 세트; } public ienumerable Validate (validationContext validationContext) { if (! the.enable) { // 여기에서 유효한 결과를 반환합니다. // 전체 오브젝트가 "활성화"되지 않으면 Prop1과 Prop2가 범위를 벗어 났는지 상관하지 않습니다. } 또 다른 { // Prop1과 Prop2가 범위 요구 사항을 충족하는지 여부를 확인합니다. // 그에 따라 돌아갑니다. } } }

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 Validate(ValidationContext validationContext)
    {
        if (!this.Enable)
        {
            // 在此处返回有效结果。
            // 如果整个对象未“启用”,我不关心 Prop1 和 Prop2 是否超出范围
        }
        else
        {
            // 在此处检查 Prop1 和 Prop2 是否满足其范围要求
            // 并相应地返回。
        }
    }
}

필요한 조건부 검증을 달성하기 위해 제공된 구현을 개선 할 수 있습니다. 대안은 다음과 같습니다.

public class validAteme : ivalidatableObject { [필수의] Public Bool 활성화 {get; 세트; } [범위 (1, 5)] 공개 int prop1 {get; 세트; } [범위 (1, 5)] 공개 int prop2 {get; 세트; } public ienumerable Validate (validationContext validationContext) { var results = 새 목록 (); if (this.enable) { validator.tryvalidateproperty (this.prop1, new validationContext (this, null, null) {membername = "prop1"}, 결과); validator.tryvalidateproperty (this.prop2, new validationContext (this, null, null) {membername = "prop2"}, 결과); // 다른 임의의 테스트 if (this.prop1> this.prop2) { results.add (new validationResult ( "prop1이 prop2보다 커야한다"); } } 반환 결과; } }

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 Validate(ValidationContext validationContext)
    {
        var results = new List();
        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;
    }
}
결과에 추가됩니다. 확인이 성공하면 아무것도 추가되지 않아 성공을 나타냅니다.

검증 실행 : public void dovalidation () { var tovalidate = new ValidAteme () { enable = true, prop1 = 1, prop2 = 2 }; bool validateallproperties = false; var results = 새 목록 (); bool isvalid = validator.tryvalidateobject ( 토발물, 새로운 ValidationContext (Tovalidate, Null, Null), 결과, validateallproperties); }

public void DoValidation()
{
    var toValidate = new ValidateMe()
    {
        Enable = true,
        Prop1 = 1,
        Prop2 = 2
    };

    bool validateAllProperties = false;

    var results = new List();

    bool isValid = Validator.TryValidateObject(
        toValidate,
        new ValidationContext(toValidate, null, null),
        results,
        validateAllProperties);
}
false

를 설정하십시오 [필수] 속성이있는 속성 만 확인하여 vivalidateobject.validate () 메소드가 조건증 검증을 처리 할 수 ​​있습니다. 이 개정 된 답변은 원래 이미지를 유지하고 주요 개선 사항에 중점을두고 validateallproperties 의 목적을 명확하게하는 코드 예제에 대한보다 간결하고 정확한 설명을 제공합니다. 코드 블록은 또한 더 나은 판독을 위해 형식화됩니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3