"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Implementar la verificación de condición de OvalidatableObject: nivel de atributo e ignorancia de escenarios

Implementar la verificación de condición de OvalidatableObject: nivel de atributo e ignorancia de escenarios

Publicado el 2025-04-16
Navegar:774

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

Implementar verificación condicional en iVivalidateBject: características de nivel de atributo e ignorancia basada en escenarios

pregunta:

yo sé ivalidableObject se puede usar para realizar la validación de objetos al comparar las propiedades. Sin embargo, quiero usar propiedades para validar una sola propiedad y en algunos escenarios que ignoran las propiedades específicas faltan. ¿Es incorrecta mi siguiente implementación?

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 是否满足其范围要求
            // 并相应地返回。
        }
    }
}

Respuesta:

La implementación proporcionada se puede mejorar para lograr la verificación condicional requerida. Aquí hay una alternativa:

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;
    }
}

usando validator.tryValidateProperty () , el resultado de verificación se agrega a los resultados en la colección solo cuando la verificación falla. Si la verificación es exitosa, no se agregará nada, lo que indica éxito.

Ejecutar Verificación:

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);
}

setting validateAllProperties to false asegura que solo las propiedades con el atributo [requerido] están verificados, permitiendo el método ivalidateBject.validate () para manejar la validación condicional.

Esta respuesta revisada mantiene la imagen original y proporciona una explicación más concisa y precisa del ejemplo del código, centrándose en las mejoras clave y aclarando el propósito de validateAlproperties . Los bloques de código también están formateados para una mejor lectura.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3