Mr.*_*ond 6 c# fluentvalidation
例如,我有两个验证规则的验证器:
// Rule 1
RuleFor(o => o.Email).Must((email) => this.GetDataDataFromDB(email) != 0)
.WithMessage("User with provided Email was not found in database!");
// Rule 2
RuleFor(o => o.Email).Must((email) => this.GetDataDataFromDB(email) >= 1)
.WithMessage("There are multiple users with provided Email in database!");
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,使用相同的方法对数据库进行了两次调用.如何调用一次并将数据重用于其他规则?
显示错误消息时的另一个问题:
RuleFor(o => o.Email).Must((email) => this.GetDataDataFromDB(email) >= 1)
.WithMessage("There are multiple users with following Email '{0}' in database!",
(model, email) => { return email; });
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来显示错误消息,而不是一直写这些lambda表达式来检索属性?就像在某处保存模型一样,然后再使用它.
简单易行的解决方案会很棒!
对于#1,恐怕没有办法做到这一点。验证器被设计为无状态的,因此它们可以跨线程重用(实际上,强烈建议您将验证器实例创建为单例,因为实例化它们的成本非常高。MVC 集成默认执行此操作)。不要弄乱静态字段,因为您会遇到线程问题。
(编辑:在这个特别简单的情况下,您可以将规则组合到对 Must 的单个调用中,但通常您不能在规则之间共享状态)
对于#2,这取决于您使用的属性验证器。大多数属性验证器实际上允许您使用 {PropertyValue} 占位符,并且该值将被自动插入。但是,在这种情况下,您使用的是不支持占位符的“必须”验证器 (PredicateValidator)。
我在这里列出了哪些验证器支持自定义占位符:https : //github.com/JeremySkinner/FluentValidation/wiki/c.-Built-In-Validators