我正在使用流畅的验证和资源文件本地化一个站点,一切正常,但是当我尝试使用验证“When()”条件设置自定义错误时。
在以下示例中:
public class InstructionValidator : AbstractValidator<InstructionModel>
{
public InstructionValidator()
{
RuleFor(x => x.Name)
.Length(0, 50)
.WithMessage(Resources.InvalidError);
RuleFor(x => x.Revision)
.NotNull()
.InclusiveBetween(1, int.MaxValue)
.WithMessage(Resources.InvalidError);
RuleFor(x => x.RevisionDate)
.NotNull()
.When(x => x.Revision > 1)
.WithMessage(Resources.RevisionDateRequiredError);
}
}
前两个规则(名称和修订版)工作正常,根据用户选择的文化显示英语或西班牙语消息。
然而,第三条规则,在“when”条件下,将始终显示英文信息。
我已经检查了网站上正在使用的所有其他规则,并且它是一致的 - 每个工作都根据cultere设置显示英语或西班牙语,除非使用“when”条件,那么它总是英语。< / p>
也许这与“何时”作为服务器与客户端检查有关?我尝试使用“WithLocalizedMessage()”而不是“WithMessage()”,并设置ValidatorOptions.ResourceProviderType,但仍然无法使其工作。
答案 0 :(得分:2)
经过一些更多的测试,我发现了发生了什么。资源或验证语法没有问题,这是本地化发生的顺序。
我将[Localize]过滤器应用于基本控制器,它适用于除服务器端验证之外的所有内容,必须在触发过滤器之前进行。
虽然我仍然不确定如何重做本地化来处理这个问题,但我提出的原始问题已经解决了 - 移动验证器内部的文化集确实会显示正确的错误消息。< / p>
答案 1 :(得分:0)
您确定ResourceManager.es上有Resources.RevisionDateRequiredError吗?
对我来说很好。但是如果你有它,我可以使用Must()为你建议一个不同的解决方案。
public InstructionValidator()
{
// ...
RuleFor(x => x.RevisionDate)
.NotNull()
.Must((instruction, revisionDate) => IsRevisionDate(instruction.Revision, revisionDate))
.WithMessage(Resources.RevisionDateRequiredError);
}
然后,创建一个返回名为“IsRevisionDate”的bool的方法:
private bool IsRevisionDate(int revision, DateTime revisionDate)
{
return revision > 1;
}
我希望它可以帮到你。