FluentValidation 自定义消息本地化不适用于 When() 条件

FluentValidation custom message localization not working with When() condition

我正在使用流畅的验证和资源文件对站点进行本地化,一切正常,除了当我尝试使用验证 "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" 条件,将始终显示英文消息。

我检查了网站上使用的所有其他规则,它们是一致的 - 每个人都根据文化集显示英语或西班牙语,除非使用 "when" 条件,然后它总是英语.

也许这与 "when" 作为服务器与客户端检查有关?我确实尝试使用 "WithLocalizedMessage()" 而不是 "WithMessage()",并设置 ValidatorOptions.ResourceProviderType,但可能仍然无法正常工作。

您确定 ResourceManager.es 上有 Resources.RevisionDateRequiredError 吗?

对我来说效果很好。但是,如果您有它,我可以使用 Must().

为您建议不同的解决方案
public InstructionValidator()
{
    // ...
    RuleFor(x => x.RevisionDate)
        .NotNull()
        .Must((instruction, revisionDate) => IsRevisionDate(instruction.Revision, revisionDate))
        .WithMessage(Resources.RevisionDateRequiredError);
}

然后,创建一个方法 returns bool 调用 "IsRevisionDate":

private bool IsRevisionDate(int revision, DateTime revisionDate)
{
    return revision > 1;
}

希望对你有所帮助

经过更多的测试,我发现了是怎么回事。资源或验证语法没有问题,这是本地化发生的顺序。

我已将 [Localize] 过滤器应用于基本控制器,它适用于所有内容,但服务器端验证除外,服务器端验证必须在过滤器被触发之前发生。

虽然我仍然不确定如何重做本地化来处理这个问题,但我最初提出的问题已经解决了——将文化集移动到验证器中确实得到了正确的错误消息来显示.