为Required属性添加自定义条件验证的实现方法
实现基于IsMain状态的条件Required验证逻辑
你不能直接在自定义验证属性的构造器里写IsMain == "off",因为属性构造器的参数必须是编译时常量,没法直接引用当前模型的其他属性值。下面提供两种可行的实现方式:
方式一:自定义ValidationAttribute
创建一个继承自ValidationAttribute的自定义属性,重写IsValid方法来访问整个模型实例,从而判断IsMain的状态:
public class RequiredIfIsMainOnAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var model = validationContext.ObjectInstance as YourModelType; if (model == null) { return new ValidationResult("模型实例无效"); } // 当IsMain不是"off"时,检查Name是否为空 if (model.IsMain != "off" && string.IsNullOrWhiteSpace(value?.ToString())) { return new ValidationResult(ErrorMessage ?? "Name字段不能为空"); } return ValidationResult.Success; } }
然后在模型中使用这个属性:
[BindProperty] [RequiredIfIsMainOn(ErrorMessage = "当IsMain不为off时,Name不能为空")] public string Name { get; set; } [BindProperty] public string IsMain { get; set; }
方式二:实现IValidatableObject接口
直接在模型类上实现IValidatableObject接口,在Validate方法中编写条件验证逻辑:
public class YourModelType : IValidatableObject { [BindProperty] public string Name { get; set; } [BindProperty] public string IsMain { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (IsMain != "off" && string.IsNullOrWhiteSpace(Name)) { yield return new ValidationResult( "当IsMain不为off时,Name不能为空", new[] { nameof(Name) } ); } } }
两种方式对比:
- 自定义Attribute更适合复用在多个模型中;
- 实现IValidatableObject更适合仅在当前模型使用的简单逻辑,代码更集中。
内容的提问来源于stack exchange,提问作者Yola
相关产品推荐
相关产品推荐

