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] 过滤器应用于基本控制器,它适用于所有内容,但服务器端验证除外,服务器端验证必须在过滤器被触发之前发生。
虽然我仍然不确定如何重做本地化来处理这个问题,但我最初提出的问题已经解决了——将文化集移动到验证器中确实得到了正确的错误消息来显示.
我正在使用流畅的验证和资源文件对站点进行本地化,一切正常,除了当我尝试使用验证 "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] 过滤器应用于基本控制器,它适用于所有内容,但服务器端验证除外,服务器端验证必须在过滤器被触发之前发生。
虽然我仍然不确定如何重做本地化来处理这个问题,但我最初提出的问题已经解决了——将文化集移动到验证器中确实得到了正确的错误消息来显示.