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

时间:2015-10-08 16:25:51

标签: asp.net-mvc localization fluentvalidation

我正在使用流畅的验证和资源文件本地化一个站点,一切正常,但是当我尝试使用验证“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,但仍然无法使其工作。

2 个答案:

答案 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;
}

我希望它可以帮到你。