如何覆盖fluentvalidator扩展方法?

时间:2019-05-11 11:30:03

标签: asp.net asp.net-mvc asp.net-mvc-4 override fluentvalidation

我正在使用.NET ASP.NET MVC4。为了进行验证,我正在使用Fluent验证。我是新来的。如何覆盖 DefaultValidatorExtensions 类的方法?

我找到了一个解决方案。

创建 basevalidator 类,该类继承了 IValidatorInterceptor AbstractValidator 。但是我没有得到如何覆盖验证方法的方法。

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

例如:

RuleFor(x => x.Name).NotEmpty();将返回“'名称'不能为空。”但我要消息“必填”。

1 个答案:

答案 0 :(得分:1)

我在此链接上找到了答案。我认为它可以帮助您: 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}'是必需的”);