"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Implementar a verificação da condição do IVALIDABLEOBJECT: nível de atributo e ignorância do cenário

Implementar a verificação da condição do IVALIDABLEOBJECT: nível de atributo e ignorância do cenário

Postado em 2025-04-16
Navegar:893

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

implemente a verificação condicional no IVALIDABLEOBJET: características do nível de atributo e ignorância baseada em cenário

pergunta:

eu sei ivalidableObject pode ser usado para executar a validação do objeto ao comparar Propriedades. No entanto, quero usar propriedades para validar uma única propriedade e em alguns cenários que ignoram propriedades específicas falham. Minha seguinte implementação está incorreta?

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

Responder:

A implementação fornecida pode ser aprimorada para obter a verificação condicional necessária. Aqui está uma 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 () , o resultado da verificação é adicionado ao resulta na coleção somente quando a verificação falha. Se a verificação for bem -sucedida, nada será adicionado, indicando sucesso.

Execute Verificação:

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

configuração validateAllProperties para false garante que apenas as propriedades com o atributo [requerir] sejam verificadas, permitir o método ivalidoBject.validate (& & &&] Método.

Esta resposta revisada mantém a imagem original e fornece uma explicação mais concisa e precisa do exemplo do código, concentrando -se nas principais melhorias e esclarecendo o objetivo de

validateAlLProperties . Os blocos de código também são formatados para melhor leitura.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3