首页 > 解决方案 > 如何覆盖 fluentvalidator 扩展方法?

问题描述

我正在使用 .NET ASP.NET MVC 4。对于验证,我正在使用 Fluent 验证。我是新来的。如何覆盖DefaultValidatorExtensions类的方法?

我找到了一种解决方案。

创建继承IValidatorInterceptorAbstractValidator的basevalidator类。但我不知道如何覆盖验证方法。

实际上我想更改任何验证方法的默认消息。该消息对于某些验证的所有属性都是通用的,因此我想覆盖这些验证方法而不是使用“WithMessage()”。

例如:

RuleFor(x => x.Name).NotEmpty();将返回“‘名称’不应为空。” 但我想要消息“必需”。

标签: asp.netasp.net-mvcasp.net-mvc-4overridingfluentvalidation

解决方案


我在这个链接上找到了答案。我认为它可以帮助你: https ://fluentvalidation.net/localization#default-messages

如果您想替换所有(或部分)FluentValidation 的默认消息,那么您可以通过实现 ILanguageManager 接口的自定义版本来做到这一点。

例如,NotNull 验证器的默认消息是“{PropertyName}”,不得为空。如果您想在应用程序中使用 NotNull 验证器替换此消息,您可以编写自定义语言管理器:

public class CustomLanguageManager : FluentValidation.Resources.LanguageManager {
  public CustomLanguageManager() {
    AddTranslation("en", "NotNullValidator", "'{PropertyName}' is required.");
  }
}

这里我们有一个继承自基础 LanguageManager 的自定义类。在其构造函数中,我们调用 AddTranslation 方法,传入我们正在使用的语言、我们想要覆盖的验证器的名称以及新消息。

完成此操作后,我们可以通过在应用程序启动例程期间在静态 ValidatorOptions 类中设置 LanaguageManager 属性来替换默认 LanguageManager:

ValidatorOptions.LanguageManager = new CustomLanguageManager();

这是一个简单的示例,它仅替换了一个验证者的英语消息,但可以扩展为替换所有语言的消息。如果您想从 FluentValidation 默认以外的完全不同的位置加载消息(例如,如果您想将 FluentValidation 的默认消息存储在数据库中),您也可以直接实现 ILanguageManager 接口,而不是从默认 LanguageManager 继承。

当然,如果您只想用验证器替换此消息,那么您可以使用 WithMessage("'{PropertyName}' is required");


推荐阅读