{ RuleFor(m => m.E-6ren">
gpt4 book ai didi

c# - 在 FluentValidation 中为规则集设置消息失败

转载 作者:行者123 更新时间:2023-11-30 17:53:50 24 4
gpt4 key购买 nike

在 FluentValidation 中有可能为规则集提供特定的错误消息吗?

类似于:

RuleSet("LoginInformation", () =>
{
RuleFor(m => m.Email).NotEmpty().EmailAddress();
RuleFor(m => m.Password).NotEmpty();
}); // I thought I can add a WithMessage here...

如果任何规则失败,应该显示一条错误消息。

最佳答案

简单的解决方案

在不改变 FluentValidation 源的情况下,不可能直接将错误消息设置到 RuleSet,但是您可以将您的规则收集到特殊列表中,并在循环中设置相同的错误消息:

RuleSet("LoginInformation", () =>
{
var loginRules = new List<IRuleBuilderOptions<CredentialsModel, object>>
{
RuleFor(m => m.Email).NotEmpty().EmailAddress(),
RuleFor(m => m.Password).NotEmpty()
};

foreach (var rule in rules)
{
// this overload chosen just to show, that all possibilities to set error message still available
rule.WithMessage("An error occured. Additional information: {0}, {1}", (model, value) => value, (model, value) => model.Email);
}
});

只有 2 个 cascade mode options ,并且您不能告诉验证器在第一次失败时停止所有规则,因此您只需要从验证结果中提取第一个错误并删除其他相同的错误。为此,您可以覆盖 AbstractValidator:

public class SingleErrorValidator<T> : AbstractValidator<T>
{
public override ValidationResult Validate(ValidationContext<T> context)
{
var result = base.Validate(context);

if (result.IsValid)
return result;

var singleErrorList = new List<ValidationFailure> { result.Errors.First() };
var singleErrorResult = new ValidationResult(singleErrorList);

return singleErrorResult;
}
}

高级解决方案:

如果您 fork FluentValidation 并且可以修改解决方案中的源代码,那么您可以为常见错误消息创建可重用的方法,并在 AbstractValidator 类中添加下一个 RuleSet 方法重载(不能使用扩展方法或继承,因为重要字段有私有(private)修饰符):

public void RuleSet(string ruleSetName, Func<List<IRuleBuilderOptions<T, object>>> function, Action<IRuleBuilderOptions<T, object>> writeRuleMessage)
{
ruleSetName.Guard("A name must be specified when calling RuleSet.");
function.Guard("A ruleset definition must be specified when calling RuleSet.");

using (nestedValidators.OnItemAdded(r => r.RuleSet = ruleSetName))
{
var list = function();

foreach (var rule in list)
{
writeRuleMessage(rule);
}
}
}

接下来你可以使用RuleSet:

RuleSet("LoginInformation", () =>
{
var rules = new List<IRuleBuilderOptions<B, object>>()
{
RuleFor(x => x.Name).NotEmpty().EmailAddress(),
RuleFor(x => x.Email).NotEmpty()
};

return rules;
}, (rule) =>
{
rule.WithMessage("An error occured");
}); // still can use another overloads, that allow access to model and validated properties

结论

两种解决方案都可以工作,但由于 KISS 原则,我建议使用第一种。

关于c# - 在 FluentValidation 中为规则集设置消息失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16775121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com