【发布时间】:2020-10-30 14:55:05
【问题描述】:
花了一天时间寻找答案。
我有以下验证器(请注意,AgeMin 属性有不同的规则取决于 RuleSet。):
class WeirdValidator : AbstractValidator<TestClass>
{
public WeirdValidator()
{
public const string CustomRuleSet = nameof(CustomRuleSet);
RuleFor(instance => instance.AgeMin).NotEmpty().WithMessage("Empty error. {PropertyName}").ScalePrecision(2, 3).WithMessage("Scale error. {PropertyName}");
RuleFor(instance => instance.FirstInt).NotEmpty().WithMessage("Empty error. {PropertyName}");
RuleSet(CustomRuleSet, () => {
RuleFor(instance => instance.AgeMin).Empty().WithMessage("{PropertyName} must be empty.");
RuleFor(instance => instance.SecondInt).NotEmpty().WithMessage("{PropertyName} must not be empty.");
});
}
}
以及以下测试类:
class TestClass
{
public decimal AgeMin { get; set; }
public int FirstInt { get; set; }
public int SecondInt { get; set; }
}
FluentValidation 允许我们组合验证器:
var result = validator.Validate(instanceToValidate, opt => {
opt.IncludeRuleSets(WeirdValidator.CustomRuleSet);
opt.IncludeProperties(nameof(instanceToValidate.AgeMin));});
但它并没有像我预期的那样工作。它不是规则的交集,而是随后的操作:首先应用 CustomRuleSet 中的所有规则,然后应用定义属性的规则。我需要验证仅选定规则集的选定属性。 我确信有一个非常简单和优雅的解决方案,但它还没有照亮我的道路。
问题: 如何验证特定规则集中的特定属性?
【问题讨论】:
-
我不太熟悉这种用法,但我观察到相同的行为;如果您指定规则集和属性,它会执行规则集和验证器中指定属性的任何规则。我在 FV 问题列表中看不到任何关于它的内容,如果没有解决方案,值得将其作为一个问题提出。
-
感谢您的回复!我似乎找到了答案并将发布答案。
-
感谢您发布您的答案。我仍然会考虑将其作为一个问题提出,因为向我阅读 IncludeRuleSets 的用法表明它应该只执行指定规则集中的规则。如果您包含
default或 IncludeRulesNotInRuleSet,我希望观察到的行为。
标签: c# fluentvalidation