使用 IValidatableObject 检查是不是设置了至少一个参数

Posted

技术标签:

【中文标题】使用 IValidatableObject 检查是不是设置了至少一个参数【英文标题】:Using IValidatableObject to check if at-least one parameter is set使用 IValidatableObject 检查是否设置了至少一个参数 【发布时间】:2022-01-11 20:24:51 【问题描述】:

我有一个 UpdateAccountRequest 对象,它代表一个 PUT 请求正文来更新现有的 Account 对象。目前,可以使用此端点更新的唯一属性是 Disabled 属性。为了确保调用者没有发送空的UpdateAccountRequest 请求,我使用IValidateObject 接口,如下所示:

public class UpdateAccountRequest: IValidatableObject

    public bool? Disabled  get; set; 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    
        if (!Disabled.HasValue)
        
            yield return new ValidationResult("Disabled must be set");
        
    

但是,在未来,我计划向这个类添加更多属性,并且我想创建一个通用方法来验证调用者是否指定了至少 一个 更新属性。我可以通过检查所有实例的属性并检查它们的类型并查看它们是否不为空来使用反射来实现这一点,但我想知道框架中是否有一些东西可以实现这一点。

【问题讨论】:

【参考方案1】:

所以我想出了这样的东西。不是我最自豪的创作,但它似乎奏效了。不确定框架是否支持这种开箱即用的功能。

public class UpdateAccountRequest: IValidatableObject

    public bool? Disabled  get; set; 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    
        var satisfiedMembers = this.GetType().GetProperties()
                          .Select(prop => prop.GetValue(this, null))
                          .Where(val => val != null);
            
        if (!satisfiedMembers.Any())
        
                yield return new ValidationResult("At-least one update parameter must be supplied");
        
    

【讨论】:

以上是关于使用 IValidatableObject 检查是不是设置了至少一个参数的主要内容,如果未能解决你的问题,请参考以下文章

在 IValidatableObject 上设置 ValidationContext 的 Items 集合?

是否可以在 IValidatableObject 方法中以强类型的方式指定字段名称?

如何在 IValidatableObject.Validate 方法的 ValidationContext 参数中提供 IServiceProvider

如果在子级上验证失败,则不会在父级上调用IValidatableObject.Validate

EF 代码优先:IValidatable 对象未验证

如何在 ASP.NET Core 中实现自定义模型验证?