我有以下类(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/