跨不同ValidationAttribute的C#共享ValidationContext失败

问题描述

要使用一系列自定义验证属性(如下所述)对输入模型进行验证。

如果第一个验证属性(即“ ValidatorAttributeOne”)的验证结果为true,则无需处理“ ValidatorAttributeTwo”验证逻辑。

要获得分配给“ validationContext.Items”字典的“ ValidationAttributeOne”的有效结果,则认为“ validationContext”将在同一http请求中的不同“ ValidationAttributes”之间共享,但下面的行始终抛出异常

var isDependedFilterValidated = (bool?)validationContext.Items[dependedFilter]

“ message”:“字典中不存在给定键'ValidationAttributeOne'。”,

public class ValidatorAttributeOne : ValidationAttribute
{
    protected override ValidationResult IsValid(object value,ValidationContext validationContext)
    {
       //custom validation

        validationContext.Items["ValidatorAttributeOne"] = true;
        return ValidationResult.Success;
    }
}


public class ValidatorAttributeTwo : ValidationAttribute
{
    private readonly string dependedFilter = default(string);

    public UsernamesEmailValidatorAttribute()
    {           
    }

    public UsernamesEmailValidatorAttribute(string filter)
    {
        dependedFilter = filter;
    }

    protected override ValidationResult IsValid(object value,ValidationContext validationContext)
    {
        var isDependedFilterValidated = (bool?)validationContext.Items[dependedFilter];

        if (isDependedFilterValidated == false)
        {
            //custom validation logic                
        }

        return ValidationResult.Success;
    }
}

public class CustomeModel
{ 
    [ValidatorAttributeOne ]
    [ValidatorAttributeTwo("ValidatorAttributeOne")] 
    public string usernames { get; set; }      
}  

解决方法

首先,如果您不想在第一个为true时执行validationContext,则两个自定义验证属性不能共享validateContext。您可以将两个validateAttributes的IsValid方法的内容设置在一起。

例如:

public class ValidationAttributeThree : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value,ValidationContext validationContext)
        {
            
            if (ValidationAttributeOne IsValid method Content is true) {
                return ValidationResult.Success;
             }
            else if(ValidationAttributeTwo IsValid method Content is true){
               return new ValidationResult("ValidationAttributeOne error message");
            }else{
                return new ValidationResult("ValidationAttributeOne error message"+"ValidationAttributeTwo error message");
            }
                
        }
    }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...