【问题标题】:FluentValidation in C# - Validation with properties in another objectC# 中的 FluentValidation - 使用另一个对象中的属性进行验证
【发布时间】:2019-07-22 13:02:56
【问题描述】:

我在 .NET Core 2.2 API 中有一个类,我正在对其应用 Fluent Validation。该类有一个整数属性public int? PurchasePrice {get;set;}

此属性的父级的父级有一个枚举,我想做的是当该枚举的值为 4 时,将此 PurchasePrice 字段设为必填。

我已经开始编写这样的自定义规则了:-

RuleFor(pd => pd.PurchasePrice).Custom((a, context) =>
{
    var parent = context.ParentContext.InstanceToValidate as ParentObject;
    var parentOfParent = context.ParentContext.ParentContext.InstanceToValidate as GrandParentObject;
});

但是,第二个 ParentContext 根本不存在于 Intellisense 中,并且由于无法识别而引发编译错误。

在编写验证规则时,我是否走错了遍历对象结构的方式?

提前致谢!

注意:检索var parent 的行按预期工作。

【问题讨论】:

  • 现在我明白了你想要做什么,我没有发现任何明显的东西,包括验证中的父母。我确实找到了When 的源代码,如果您需要自己实现某些东西,这可能会有所帮助。见here
  • 是的,这就是我所需要的加上对基础对象的引用来访问我需要的字段。谢谢。请作为答案,我可以标记。
  • 我认为您最好提供问题的解决方案作为答案,因为我所做的只是查找When 的当前实现,这并不能真正回答您的问题问。

标签: c# .net .net-core fluentvalidation


【解决方案1】:

也许何时可以在这里解决您当前的需求。但如果您需要编写更复杂的验证,则可以使用 Must必须允许您访问正在验证的模型,因此您可以访问验证函数中模型的任何部分。它也是一种编写自定义验证的方式。

考虑到 AdbstractValidator 的类型是所述枚举属性所在的父类型(又名模型),您可以使用 Must,如下所示:

RuleFor(pd => pd.PurchasePrice)
    .Must((model, price) => 
    { 
         return model.enum == enum.value && price != null; 
    })
    .WithMessage("Price is required when enum is of value");

必须有几个重载,一个期望以属性值作为第一个参数并返回布尔值的函数。另一个接受两个参数,上下文中的模型,正在验证的属性的值并返回一个布尔值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多