FluentValidation调用RuleSet和Common Rules

我有以下课程

public class ValidProjectHeader : AbstractValidator { 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()); }); } 

我想要做的是用rulset调用validation,但我也想在使用RuleSet调用validation时返回“常用”规则。

我调用validation的代码如下

 public abstract class BaseValidator { private List _errors; public bool IsValid { get; protected set; } public List Errors { get { return _errors; } protected set { _errors = value; } } public virtual bool CallValidation() { Errors = new List(); 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(); 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(); } } 

我可以使用成员ruleSet调用Method CallValidation ,但它也不会调用“常用”规则。

我知道我可以为运行这些规则创建一个“Common”RuleSet,但在这种情况下,我必须始终使用Common RuleSet调用validation。

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

相反,你可以这样做:

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

需要using指令将Validate()扩展方法从DefaultValidatorExtensions带入具有ruleSet属性的ruleSet 。 否则,只有inheritanceAbstractValidatorValidate()方法才能使用,该方法没有ruleSet参数。

在Validator类中创建一个方法,该方法包括需要始终应用的所有“常用”规则。 现在你可以调用这个方法

  • 来自你的“创建”RuleSet
  • 来自RuleSet之外

 public class MyEntityValidator : AbstractValidator { public MyEntityValidator() { RuleSet("Create", () => { RuleFor(x => x.Email).EmailAddress(); ExecuteCommonRules(); }); ExecuteCommonRules(); } ///  /// Rules that should be applied at all times ///  private void ExecuteCommonRules() { RuleFor(x => x.Name).NotEmpty(); RuleFor(x => x.City).NotEmpty(); } } 

您可以为控制器中的操作定义RuleSet

 [HttpPost] public ActionResult Create([CustomizeValidator(RuleSet = "Create")] MyEntity model) 

这将确保将使用RuleSet Createvalidation对操作Create的请求。 所有其他操作将使用对控制器中的ExecuteCommonRules的调用。

我找到了一种方法来通过向CallValidation(string ruleSet)方法添加第二个validator.Validate来实现它,如下所示

 public virtual bool CallValidation(string ruleSet) { Errors = new List(); 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))); FluentValidation.Results.ValidationResult resultCommon = validator.Validate(this); IsValid = (result.IsValid && resultCommon.IsValid); Errors = result.Errors.Union(resultCommon.Errors).ToList(); return IsValid; }