You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:49:50