【问题标题】:FluentValidation custom message localization not working with When() conditionFluentValidation 自定义消息本地化不适用于 When() 条件
【发布时间】:2015-10-08 16:25:51
【问题描述】:

我正在使用流利的验证和资源文件本地化一个站点,并且一切正常,除了当我尝试使用验证 "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,但可能仍然无法正常工作。

【问题讨论】:

    标签: asp.net-mvc localization fluentvalidation


    【解决方案1】:

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

    我已将 [Localize] 过滤器应用于基本控制器,它适用于一切,除了服务器端验证,它必须在过滤器被触发之前发生。

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

    【讨论】:

    【解决方案2】:

    你确定你的ResourceManager.es上有Resources.RevisionDateRequiredError吗?

    它对我来说很好用。但是,如果您有它,我可以使用 Must() 为您建议不同的解决方案。

    public InstructionValidator()
    {
        // ...
        RuleFor(x => x.RevisionDate)
            .NotNull()
            .Must((instruction, revisionDate) => IsRevisionDate(instruction.Revision, revisionDate))
            .WithMessage(Resources.RevisionDateRequiredError);
    }
    

    然后,创建一个返回 bool 的方法,名为 "IsRevisionDate"

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

    希望对你有帮助。

    【讨论】:

    • 绝对不是缺少的资源。我将有问题的资源替换为其他验证规则,并且效果很好。我尝试了您的示例,虽然它没有按原样工作(在 Must() 之前的 NotNull() 始终需要该字段),但我确实查找了 Must() 文档,这可能对使用 bool 方法有帮助检查修订和修订日期。但这样做的问题是,这个示例所来自的项目有大量的验证条件,然后都需要重做,我希望避免这种情况。
    • 好吧,我建议你把 NotNull() 取下来,看看“When()”是否会起作用。此外,您还可以在规则中添加“级联”。像这样的东西:RuleFor(p =&gt; p.RevisionDate).Cascade(CascadeMode.Continue).NotNull().When(x =&gt; x.Revision &gt; 1);
    • 或者这个:RuleFor(p =&gt; p.RevisionDate).When(x =&gt; x.Revision &gt; 1, () =&gt; { RuleFor(p =&gt; p.RevisionDate).NotNull(); });
    • 感谢新想法 aj。我已经尝试过更改顺序和级联,但是每当使用 When() 时,无论它出现在哪里,它仍然会导致问题。
    猜你喜欢
    • 1970-01-01
    • 2020-02-07
    • 2014-04-20
    • 1970-01-01
    • 2016-04-25
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多