微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决跨不同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");
            }
                
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。