FluentValidation 不适用于 null 属性

FluentValidation not working for a null property

我正在使用 FluentValidationIDataErrorInfo,我有一个验证器定义如下:

public class StsInfoValidator : AbstractValidator<StsInfo>
{
    public StsInfoValidator()
    {
        RuleFor(x => x.SomeProperty).Cascade(CascadeMode.StopOnFirstFailure)
            .NotNull().NotEmpty().WithMessage("SomeProperty is required.");

    }        
}

但是,传入 null 属性 似乎不会触发验证器:

#region IDataErrorInfo

public string this[string columnName]
{
    get
    {

        var validator = new StsInfoValidator();

        if (columnName.Equals("SomeProperty"))
        {
            // SomeProperty below is null
            if (validator.Validate(this, SomeProperty).Errors.Any())
                return validator.Validate(this, CampusNexusApiServer).Errors.FirstOrDefault().ErrorMessage;
            else
            {
                validator = null;
                return string.Empty;
            }
        }

        return string.Empty;
    }
}

#endregion

你遇到的问题是,如果你选择使用需要 lambda 表达式来评估你的 属性 的 Validate 重载,你将不得不这样做:

而不是:

validator.Validate(this, SomeProperty);

你需要:

validator.Validate(this, s => s.SomeProperty);

这里是重载文档:

或者,您可以使用其他 Validate 重载并将 属性 的名称作为字符串传递:

validator.Validate(this, columnName);validator.Validate(this, "SomeProperty");

这是验证的 属性 名称重载:

    public string this[string columnName]
    {
        get
        {

            var validator = new StsInfoValidator();

            if (columnName.Equals("SomeProperty"))
            {
                // SomeProperty below is null
                //option 1
                var result  = validator.Validate(this,s => s.SomeProperty);
                //option 2
                //var result  = validator.Validate(this, columnName);
                //option 3
                //var result  = validator.Validate(this, "SomeProperty");
                if (result.Errors.Any())
                    return validator.Validate(this, CampusNexusApiServer).Errors.FirstOrDefault().ErrorMessage;
                else
                {
                    validator = null;
                    return string.Empty;
                }
            }

            return string.Empty;
        }
    }