FluentValidation不适用于null属性

时间:2015-05-19 15:44:08

标签: c# wpf fluentvalidation idataerrorinfo

我正在使用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

1 个答案:

答案 0 :(得分:2)

您遇到的问题是,如果您选择使用需要lambda表达式的Validate重载来评估您的属性,那么您必须这样做:

而不是:

validator.Validate(this, SomeProperty);

你需要:

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

这里有这个重载文档:

enter image description here

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

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

以下是Validate的属性Name(s)重载:

enter image description here

    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;
        }
    }