[英]FluentValidation Call RuleSet and Common Rules
我有以下課程
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());
});
}
我正在嘗試做的是使用 rulset 調用驗證,但我也想在使用 RuleSet 調用驗證時返回“通用”規則。
我調用驗證的代碼如下
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
屬性。 否則,您將只能通過繼承AbstractValidator<T>
獲得Validate()
方法,它沒有ruleSet
參數。
在您的 Validator 類中創建一個方法,其中包括需要始終應用的所有“通用”規則。 現在你可以調用這個方法
例子
public class MyEntityValidator : AbstractValidator<MyEntity>
{
public MyEntityValidator()
{
RuleSet("Create", () =>
{
RuleFor(x => x.Email).EmailAddress();
ExecuteCommonRules();
});
ExecuteCommonRules();
}
/// <summary>
/// Rules that should be applied at all times
/// </summary>
private void ExecuteCommonRules()
{
RuleFor(x => x.Name).NotEmpty();
RuleFor(x => x.City).NotEmpty();
}
}
您在控制器中為操作定義規則集
[HttpPost]
public ActionResult Create([CustomizeValidator(RuleSet = "Create")] MyEntity model)
這將確保對動作 Create 的請求將通過 RuleSet Create 進行驗證。 所有其他操作將使用對控制器中 ExecuteCommonRules 的調用。
我找到了一種方法,通過向CallValidation(string ruleSet)
方法添加第二個validator.Validate
來實現,如下所示
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)));
FluentValidation.Results.ValidationResult resultCommon = validator.Validate(this);
IsValid = (result.IsValid && resultCommon.IsValid);
Errors = result.Errors.Union(resultCommon.Errors).ToList();
return IsValid;
}
我剛剛在下面嘗試過並且有效
[CustomizeValidator(RuleSet = "default, Create")
Fluent validation 10+ onwards.
using FluentValidation;
var validationResult = await
validator.ValidateAsync(account,options=>options("nameOfRuleSet"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.