c# - FluentValidation 调用规则集和通用规则

标签 c# fluentvalidation

我有以下类(class)

public class ValidProjectHeader : AbstractValidator<Projects.ProjectHeader>
    {
        public ValidProjectHeader()
        {

            RuleFor(x => x.LobId).Must(ValidateLOBIDExists);
            RuleFor(x => x.CreatedByUserId).NotEmpty();
            RuleFor(x => x.ProjectManagerId).NotEmpty();
            RuleFor(x => x.ProjectName).NotEmpty();
            RuleFor(x => x.SalesRepId).NotEmpty();
            RuleFor(x => x.DeliveryDate).NotEmpty();
            RuleFor(x => x.ProjectStatusId).NotEmpty();
            RuleFor(x => x.DeptartmentId).NotEmpty();
            RuleFor(x => x.CustomerId).NotEmpty();

            RuleSet("Insert", () =>
            {
                RuleFor(x => x.ProjectLines).Must(ValidateProjectLines).SetCollectionValidator(new ValidProjectLine());
            });
            RuleSet("Update", () =>
            {
                RuleFor(x => x.ProjectLines).SetCollectionValidator(new ValidProjectLine());
            });


        }

我想做的是使用规则集调用验证,但我也想在使用规则集调用验证时返回“通用”规则。

我调用验证的代码如下

public abstract class BaseValidator
    {
        private List<ValidationFailure> _errors;
        public bool IsValid { get; protected set; }
        public List<ValidationFailure> Errors
        {
            get { return _errors; }
            protected set { _errors = value; }
        }
        public virtual bool CallValidation()
        {
            Errors = new List<ValidationFailure>();
            ValidatorAttribute val = this.GetType().GetCustomAttributes(typeof(ValidatorAttribute), true)[0] as ValidatorAttribute;
            IValidator validator = Activator.CreateInstance(val.ValidatorType) as IValidator;
            FluentValidation.Results.ValidationResult result = validator.Validate(this);
            IsValid = result.IsValid;
            Errors = result.Errors.ToList();
            return result.IsValid;
        }

        public virtual bool CallValidation(string ruleSet)
        {
            Errors = new List<ValidationFailure>();
            ValidatorAttribute val = this.GetType().GetCustomAttributes(typeof(ValidatorAttribute), true)[0] as ValidatorAttribute;
            IValidator validator = Activator.CreateInstance(val.ValidatorType) as IValidator;
            FluentValidation.Results.ValidationResult result = validator.Validate(new FluentValidation.ValidationContext(this, new PropertyChain(), new RulesetValidatorSelector(ruleSet)));
            IsValid = result.IsValid;
            Errors = result.Errors.ToList();
            return result.IsValid;
        }

        public BaseValidator()
        {
            Errors = new List<ValidationFailure>();
        }
    }

我可以使用成员 ruleSet 调用方法 CallValidation 但它也不会调用“通用”规则。

我知道我可以创建一个“通用”规则集来运行这些规则,但在那种情况下我必须始终使用通用规则集调用验证。

有什么方法可以调用 RuleSet 并调用通用规则。

最佳答案

相反,你可以这样做:

using FluentValidation;
...
FluentValidation.Results.ValidationResult resultCommon =
    validator.Validate(parameter, ruleSet: "default, Insert");

using需要指令才能带上 Validate()来自 DefaultValidatorExtensions 的扩展方法进入范围,其中有 ruleSet属性(property)。否则你将只有 Validate()继承可用的方法 AbstractValidator<T> ,它没有 ruleSet争论。

关于c# - FluentValidation 调用规则集和通用规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13877227/

相关文章:

c# - 如何在 FluentValidation 中重用数据

c# - 如何拦截 FluentValidation 错误响应,以便将其格式化为我的标准

c# - 获取和设置 MySQL 选择

c# - 在 C# 的文件夹中查找最新创建的文件的好方法是什么?

c# - FluentValidation 中每个自定义规则的客户端验证的最佳方法

c# - 如何将 FluentValidator 挂接到 Web API?

c# - 打开一个表单,关闭它,然后在同一位置再次打开它

c# - foreach 语句不能对 'getenumerator' 的公共(public)定义类型的变量进行操作

c# - 计算机崩溃后 VS 2013 未加载 'Antlr3.Runtime' 程序集

c# - MVC 需要 TagHelper 使用 FluentValidation ASPNET Core