FluentValidation LogOnFailure 覆盖

2024-04-18

在我的验证器类中,我有一些规则。
我需要将一些验证错误记录到数据库中。

这是我的验证器:

RuleFor(u => u.LastName)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .NotEmpty().WithMessage("Last name is required")
    .Length(3, 20).WithMessage("Must have between 3 and 20 letters");

RuleFor(u => u.BirthDate)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .NotNull().WithMessage("Birth date is required")
    .Must(c => c > new DateTime(1920, 01, 01)).WithMessage("Too old");

RuleFor(u => u.Age)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .NotNull().WithMessage("This is required")
    .GreaterThan(18).WithMessage("Must be at least 18")
    .Must((model, age, context) =>
    {
        DateTime today = DateTime.Today;
        int ageToCompare = today.Year - model.BirthDate.Year;
        return ageToCompare == age;
    }).WithMessage("Invalid age");

对于上述规则,我只想记录特定的错误消息。 我知道我可以像这样使用 OnAnyFailure :

RuleFor(u => u.Age)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .NotNull().WithMessage("This is required")
    .GreaterThan(18).WithMessage("Must be at least 18").OnAnyFailure(LogOnFailure)
    .Must((model, age, context) =>
    {
        DateTime today = DateTime.Today;
        int ageToCompare = today.Year - model.BirthDate.Year;
        return ageToCompare == age;
    }).WithMessage("Invalid age").OnAnyFailure(LogOnFailure)

private void LogOnFailure(CreateAccountBindingModel obj))
    {
        Debug.WriteLine(obj);
    }

但这样我就无法记录任何有用的东西,因为OnAnyFailure将 BindingModel 作为参数,因此我只会获取用户输入的值,而不会出现错误消息。

我尝试创建可以作为以下方式工作的扩展方法OnAnyFailure但因为我是 FluentValidation 的新手,所以我什至无法编译我的代码。

下面是我的代码:

public static class IRuleBuilderOptionsExtensions
{
    public static IRuleBuilderOptions<T, TProperty> OnAnyFailure<T, TProperty>(this IRuleBuilderOptions<T, TProperty> rule, Action<T, PropertyValidatorContext> onFailure)
    {
        return rule;
        //return rule.Configure(config => {
        //  config.OnFailure = onFailure.CoerceToNonGeneric();
        //});
    }
}

这样我就可以调用:

private void LogOnFailure(CreateAccountBindingModel obj), PropertyValidatorContext context)
{
    //log logic
}

基本上我需要的是创建覆盖LogOnFailure将能够访问 PropertyValidatorContext。


您可以第二次验证您的模型以显示它:

public class MyValidator
{
    public MyValidator()
    {
        // default behavior
        Validate();

        // works only when RuleSet specified explicitly as "Debug"
        RuleSet("Debug", ()=> {
            Validate();
            FailAndLogErrors();
        })

        private void Validate()
        {
            RuleFor(u => u.Age)
                //... set cascade mode, define rules with error messages
            RuleFor(u => u.LastName)
                //... set cascade mode, define rules with error messages
            RuleFor(u => u.BirthDate)
                //... set cascade mode, define rules with error messages
        }

        // force failing
        private void FailAndLogErrors()
        {
            RuleFor(m => m)
                .Must(m => false)
                .WithName("_fakeProperty_")
                .OnAnyFailure(m => LogIfFailed(this, m))
        }

        private void LogIfFailed(MyValidator validator, CreateAccountBindingModel obj))
        {
            var errors = validator.Validate(obj, "Debug").Errors;
            if (errors.Count > 1) // prevent displaying valid model
            {
                var fakeError = errors.First(e => e.PropertyName == "_fakeProperty_");
                errors.Remove(fakeError);
                WriteErrors(errors);
            }
        }

        private void WriteErrors(IList<ValidationFailure> errors)
        {
            foreach(var e in errors)
            {
                Debug.WriteLine(e);
            }
            Debug.WriteLine("");
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FluentValidation LogOnFailure 覆盖 的相关文章

随机推荐

  • 寻找 Maven 工件:Spring + Hibernate + JPA

    我是 Maven 新手 有以下 2 个关于 Maven 的问题 我正在寻找一个包含 Spring Hibernate JPA 的 Maven 工件 我发现的唯一一种是与 Flex 混合的 现在 我想保持简单 并且不想处理 Flex 增加的复
  • 范围过滤器不适用于“gt”运算符,但适用于“lt”

    我正在使用弹性搜索来索引我的文档 并希望根据特定属性过滤文档 这是我的代码 filter push range audience ethnicity asian gt 50 它不适用于 gt 运算符 发回不一致的结果 但适用于 lt 运算符
  • ChromeDriver 的默认位置以及在 Windows 上安装 Chrome 的默认位置是什么

    我需要安装chromedriver在 Windows 操作系统上 他们在下面的文章中指定 https sites google com a chromium org chromedriver getting started https si
  • Xcode 8 控制台垃圾? [复制]

    这个问题在这里已经有答案了 还有其他人遇到过 Xcode 8 控制台显示一堆随机内容的问题吗 我不想让所有这些弄乱我的调试消息和日志 有人知道如何关闭此功能吗 编辑 发行说明指定控制台可能会转储对 watchOS 无用的内容 但不适用于 i
  • MySQL - 如何诊断警告“中止连接 - (读取通信数据包超时)”的原因

    我在运行 MySQL 的相当繁忙的 Windows 2008 R2 Web 服务器上遇到了一些问题 应用程序间歇性崩溃 日志通常指向 MySQL 作为路由原因 因为应用程序无法连接到 MySQL 这并不会影响所有用户 只会影响一些不幸的用户
  • Oracle - 如何使用快速刷新和联接创建物化视图

    所以我很确定 Oracle 支持这一点 所以我不知道我做错了什么 这段代码的工作原理 CREATE MATERIALIZED VIEW MV Test NOLOGGING CACHE BUILD IMMEDIATE REFRESH FAST
  • 将svn迁移到git的子目录

    我想用 git 替换我的 svn 存储库 不幸的是 我无法一次性完成此操作 长话短说 我需要将带有历史记录的 svn 存储库移动到预先存在的 git 存储库的子目录中 所以我目前有 svn svn1 svn2 git git1 git gi
  • vscode jest 扩展无法正常工作

    我正在与VSCode并安装了扩大 Jest 为了更好的笑话测试环境 在扩展的指令中我看到我们得到了很好的智能感知支持对于杰斯特的命令 问题 我在底部栏上没有看到 Jest 图标 这意味着文本无法正常工作 我仍然没有得到对 jest 命令的智
  • 为什么绑定参数不指向实际的函数参数

    为什么 limit 是 20 而不是 el 20 因为在 isFullAge bind this 20 中 20 是最后一个参数 所以它必须传递给 el 参数 但为什么它被设置为 limit 参数 var years 1990 1965 1
  • 如何在 iPhone 中不使用 NSDictionary/NSMutableDictionary 中的 Key 来获取值?

    我有一个 Json 键和值方法 格式的 Web 服务响应 我解析并获取了最多的 Web 服务方法 但是 在一种网络服务方法中 我无法从键中获取值 我在这里附上示例响应 lessons ObjectiveC Book brief desc O
  • asp.net core 5.0 RequestSizeLimit 不起作用

    我正在使用 ASP net core 5 0 看起来RequestSizeLimit不管用 我有以下控制器 HttpPost addfile RequestSizeLimit 5 242 880 5MB public IActionResu
  • RAY Python 框架内存不足

    我用 ray 创建了一个简单的远程函数 它占用的内存很少 然而 运行一小段时间后 内存稳步增加 并且出现 RayOutOfMemoryError 异常 下面的代码是这个问题的一个非常简单的例子 result transformed nump
  • Django Admin:将多个管理类注册到同一模型

    是否可以将多个管理类注册到同一模型 我想让 PostAdmin 和 MyPostAdmin 都注册到 Post 模型 现在我正在尝试将代理模型与 MyPost 一起使用 但它在管理面板中为我提供了两个不同的模型 并且具有各自的功能 管理员
  • Firebase 通过函数写入 Firestore 时出错:“7 PERMISSION_DENIED:缺少或权限不足”

    我正在尝试编写一个简单的 Firebase 函数 使用 TypeScript 将记录添加到 Firestore 代码的精简版本是 import as admin from firebase admin import as functions
  • php/mysql:自定义站点搜索

    首先 我无法使用 sphinx 因为我使用共享托管 我不喜欢谷歌解决方案 即 自定义搜索有这些愚蠢的广告 而且网站搜索不是免费的 我想自己创建搜索机制 我有页面表 我想通过关键字搜索页面内容 在结果页面上我想显示与所需关键字匹配的部分文本
  • 将 Laravel 项目文件保存在 public_html 中是否不安全?

    我在共享主机上的 public html 即下一级 中有 3 个不同的 laravel 项目 我更改了每个域 子域文档根路径以指向相应的项目 公共文件夹 即 public html project1 public 此外 我将 Options
  • 什么时候适合使用分号?

    我知道 JavaScript 以及 TypeScript 在很多情况下支持省略分号 尽管如此 我想添加分号以使其明确 如建议的那样TypeScript 深入探究 https basarat gitbooks io typescript co
  • LINQ to Entities 无法识别方法“System.String ToString(Int32)”

    您好 我正在使用 linq 查询 该查询抛出错误 LINQ to Entities does not recognize the method System String ToString Int32 method 并且此方法无法转换为存储
  • Queryable.OfType 如何工作?

    重要的问题不是 Queryable OfType 是什么 do 它是 我在那里看到的代码如何实现这一点 反思 Queryable OfType 我看到 经过一些清理后 public static IQueryable
  • FluentValidation LogOnFailure 覆盖

    在我的验证器类中 我有一些规则 我需要将一些验证错误记录到数据库中 这是我的验证器 RuleFor u gt u LastName Cascade CascadeMode StopOnFirstFailure NotEmpty WithMe