C# 如何使用fluent验证将值传递到错误消息中

C# 如何使用fluent验证将值传递到错误消息中,c#,fluentvalidation,C#,Fluentvalidation,是否可以将值传递到错误消息中。我试过这样的方法: RuleFor(x => x.ForeName).Length(1, 255).WithLocalizedMessage(() => String.Format(ValidationErrors.TooLong, "255")); ValidationErrors是我的资源文件,其中包含: TooLong请使用少于{0}个字符 这: 工作正常。对于当前发布的FluentValidation(v2)版本,使用本地化消息时不支持此功能

是否可以将值传递到错误消息中。我试过这样的方法:

RuleFor(x => x.ForeName).Length(1, 255).WithLocalizedMessage(() => String.Format(ValidationErrors.TooLong, "255"));
ValidationErrors是我的资源文件,其中包含:

TooLong请使用少于{0}个字符

这:


工作正常。

对于当前发布的FluentValidation(v2)版本,使用本地化消息时不支持此功能

WithLocalizedMessage的第一个参数必须始终标识一个资源属性-不能在其中放置任意代码(例如调用string.format)

如果您使用的是非本地化邮件,则可以执行以下操作:

RuleFor(x => x.Property).Length(1,255).WithMessage("Max number of chars is {0}", "255");
从FluentValidation v3开始,您还可以使用这种方法处理本地化错误消息,但目前还没有二进制版本,因此如果您想利用这种方法,可以从项目站点获取并构建源代码

作为替代方案,您可以使用FV内置的对默认验证器命名占位符的支持,而不是使用数字占位符。因此,如果您使用的是.Length(1255),那么可以在错误消息中使用{MaxLength},而不是{0}:

请使用少于{MaxLength}个字符


…和FV将自动将其替换为您输入的最大值。这里有所有命名占位符的完整列表。

谢谢。我想这样的东西不会是一个解决方案:RuleFor(x=>x.ForeName).Length(1255).WithMessage(String.Format(ValidationErrors.TooLong,“255”);问题是,它强制在构造规则时查找本地化消息。这在某些情况下可能会起作用,但如果缓存验证器(例如,使用IoC容器),这是推荐的行为(由于性能),那么具有不同文化背景的用户可能最终会收到错误语言的消息。WithLocalizedMessage缓存资源类型和资源名称,在每次需要消息时强制进行新的查找。
RuleFor(x => x.Property).Length(1,255).WithMessage("Max number of chars is {0}", "255");