FluentValidation 集合属性未验证

2024-04-28

这是我第一次尝试实现 FluentValidation,因为我需要涵盖复杂的验证场景。

我试图验证的类具有大量属性、复杂对象和多个集合。

我没有遇到验证主类的属性的问题,甚至检查集合是否不为空,但在验证每个集合中的对象属性时确实遇到了问题。

为了实现这一点,我遵循了此处记录的示例(检查“重新使用集合验证器”):http://fluidation.codeplex.com/wikipage?title=creatingavalidator http://fluentvalidation.codeplex.com/wikipage?title=creatingavalidator

这些是我的模型类(减少以提高可读性)

public class Caso
{
public int Id { get; set; } 
public string Descripcion { get; set; }
public List<Medicamento> Medicamentos { get; set; }
}

public class Medicamento
{
public int Id { get; set; }
public string Nombre { get; set; }
}

这些是验证器类:

public class CasoValidator : AbstractValidator<CasoAdverso>
{
    public CasoValidator()
    {
        RuleSet("Iniciar", () =>
        {
            // Validated OK
            RuleFor(x => x.Descripcion).NotEmpty();
            // Validated OK
            RuleFor(x => x.Medicamentos).Must(x => x != null && x.Count > 0).WithMessage("No puede iniciar un caso sin medicamentos cargados");
            RuleFor(x => x.Medicamentos).SetCollectionValidator(new MedicamentoValidator());
        });
    }
}

public class MedicamentoValidator : AbstractValidator<Medicamento>
{
    public MedicamentoValidator()
    {
        // NOT Validated. Even if the object property is empty the error message doesn't appear. I also checked using "NotNull" and "NotEmpty" clauses
        RuleFor(x => x.Nombre).NotNull().WithMessage("Debe especificar un nombre"); 
    }
}

(注意:我使用规则集是因为不同的验证模式取决于工作流程中的文档状态)

我正在从控制器手动执行验证(无 MVC 集成)

[HttpPost]
public ActionResult Iniciar(Caso c)
{
    CasoValidator validator = new CasoValidator();
    FluentValidation.Results.ValidationResult validate = validator.Validate(c, ruleSet: "Iniciar"); 


    // ...
}

通过此实现,主类的属性得到了很好的验证,但我还需要验证集合中“Medicamento”类的每个属性。

我可能在这里遗漏了一些东西吗?是否应该使用可用的 RuleForEach 子句进行验证?

任何帮助将不胜感激。


看来规则集设置适用于子验证器以及主验证器。

我在 xUnit.net 测试中测试了你的代码,并确认了它。

如果您更改要执行的规则集,您应该会发现它按预期工作:

CasoValidator validator = new CasoValidator();
FluentValidation.Results.ValidationResult validate = validator.Validate(c, ruleSet: "default,Iniciar");

“默认”规则集将适用于 MedicamentoValidator 规则。

我在文档中没有找到这个,只是通过测试。

这是示例单元测试:

[Fact]
public void Test1()
{

    Caso c = new Caso()
    {
        Id = 1,
        Descripcion = "none",
        Medicamentos = new List<Medicamento>()
    };

    c.Medicamentos.Add(new Medicamento()
    {
        Id = 0,
        Nombre= null
    });

    CasoValidator validator = new CasoValidator();
    FluentValidation.Results.ValidationResult validate = validator.Validate(c, ruleSet: "default,Iniciar");

    Assert.NotEmpty(validate.Errors);
}

更新:我找到了杰里米·斯金纳(Jeremy Skinner)针对这种行为的参考:http://fluidation.codeplex.com/discussions/266920 http://fluentvalidation.codeplex.com/discussions/266920

规则集级联到任何子验证器,因此无论哪个规则集 选择由顶级验证器使用也将由 子验证器。 因此,如果您在 CreateProfileModelValidator 上运行“最小”规则集,则仅使用“最小”规则集中的规则 将运行于bothCreateProfileModelValidator 和 配置文件验证器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FluentValidation 集合属性未验证 的相关文章

随机推荐

  • 如何将砌体项目居中?

    我已经设置了砌体来显示项目 如下所示 list masonry itemSelector propitem columnWidth 230 这有效 但所有项目 propitem 向左浮动 例如 如果我的容器 list宽度为 600 像素 左
  • tar 命令在提取时更改所有者:组

    使用此命令提取文件时tar zxf bluez arm package tgz文件和目录的所有者 1000 组 脉冲 是 更改如下例 Example drwxrwxr x 4 1000 pulse 1024 Jul 21 00 32 dbu
  • Marionette.View 中 UI 元素的可用性

    我只是想了解 Backbone Marionette 关于 UI 元素的观点背后的决定 在现有 DOM 元素上实例化 Marionette View 时 如下所示 view new Marionette ItemView el elemen
  • T-SQL 跳过获取存储过程

    我在这个网站上似乎运气不太好 但我仍然是个乐观主义者 我会继续努力 我有两个表 期刊和文章类别 使用此查询连接 SELECT Journals JournalId Journals Year Journals Title ArticleCa
  • 在 Prolog 中动态拆分列表

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • 隐藏 asp 单选按钮文本

    我有一个 asp 单选按钮 我想在 javascript 中将其可见性设置为 false
  • 发生异常后不刷新会话 - NHibernate

    我正在 NET 3 5 NHibernate 下开发一个 ASP NET MVC Web 应用程序 并托管在 Windows Azure 上 当 web 应用程序从本地开发结构运行时 它可以正常工作 然而 当我将其移动到 Windows A
  • Eclipse WTP 与 Tomcat 中干净工作目录和干净工作目录之间的区别

    我正在使用 Eclipse 进行 Java Web 开发 我安装了 WTP 和 Tomcat 我通过 Eclipse 运行 Tomcat 这是一个非常标准的配置 我想了解的是 当您右键单击 服务器 选项卡中的服务器时 它会为您提供两个选项
  • Pytorch Tensor 如何获取元素索引? [复制]

    这个问题在这里已经有答案了 我有 2 个名为x and list它们的定义如下 x torch tensor 3 list torch tensor 1 2 3 4 5 现在我想获取元素的索引x from list 预期输出是一个整数 2
  • 如何从 C# 中的显示名称获取 Active Directory 中的用户名?

    我希望能够使用 Active Directory 中用户的显示名称来获取该用户的用户 ID 显示名称是从数据库中获取的 并且已在该用户会话期间使用以下代码来存储以获取显示名称 using System DirectoryServices A
  • Dim As New 与 Dim / Set 有什么区别

    在 VBA 中 我可以通过以下两种方式之一创建对象 First way Dim myCol1 As New Collection Second way Dim myCol2 As Collection Set myCol2 New Coll
  • 可以通过robotium在测试用例中打开/关闭wifi吗

    我们可以在 Robotium 的测试用例中打开 关闭设备的 Wi Fi 吗 因为我正在测试一个问题 需要在初始阶段打开 wifi 然后关闭 wi fi 并继续测试 是的 你可以做到 请参阅示例 公共无效testNoNetworkConnec
  • “res.render”有什么作用,html 文件是什么样的?

    什么是res render做什么 html 文件是什么样的 我的最终目标是将文本文件中的任意逗号分隔值加载到 html 文件中 例如 我只能推断视图是 html 文件 并且回调返回该 html 文件 这是文档 http expressjs
  • ruby 2.1.2超时仍然不是线程安全的吗?

    我有 50 个 sidekiq 线程在网络上爬行 几周前 这些线程在运行大约 20 分钟后开始挂起 当我执行回溯转储时 大多数线程都卡在 net http 初始化上 app vendor ruby 2 1 2 lib ruby 2 1 0
  • 跨线程操作无效:从创建它的线程以外的线程访问控制“dataGridView1”[重复]

    这个问题在这里已经有答案了 我有一个 Windows 表单 需要很长时间才能将数据加载到我的 datagridview 中 我不断收到这一行的错误 dataGridView1 Rows Add row 跨线程操作无效 控制 dataGrid
  • 如何处理“IllegalStateException:BeanFactory 未初始化或已关闭”?

    使用 Tomcat 7 上的 Grails 2 0 0 我在启动时得到以下结果 2011 08 21 11 10 09 758 main ERROR StackTrace Full Stack Trace java lang Illegal
  • 通过从数组添加对象来数组?

    我不确定我在这里做错了什么 我尝试了各种组合来尝试将数组复制到变量 mmm 中 我正在尝试学习如何创建 2D 数组 然后运行循环将 init array 放入 10 列 NSMutableArray mmm NSMutableArray a
  • 使用 UIAlertView 以编程方式退出 iOS 应用程序

    我正在通过以下方法中止我的 iOS 应用程序 void cancelSelected UIAlertView alert UIAlertView alloc initWithTitle nil message Are you sure yo
  • 在 R 中导入 png 文件并转换为动画(.mp4)

    我正在尝试用 R 中的几个 png 文件创建一个简短的动画 我尝试了 packagemagick但只有当我将它们保存为 gif 时它才有效 当我尝试另存为 mp4 时 它将生成一个 mp4 文件 但一旦打开它 只会显示第一张图像 我的代码是
  • FluentValidation 集合属性未验证

    这是我第一次尝试实现 FluentValidation 因为我需要涵盖复杂的验证场景 我试图验证的类具有大量属性 复杂对象和多个集合 我没有遇到验证主类的属性的问题 甚至检查集合是否不为空 但在验证每个集合中的对象属性时确实遇到了问题 为了