为了账号安全,请及时绑定邮箱和手机立即绑定

C# 中的 FluentValidation - 使用另一个对象中的属性进行验证

C# 中的 FluentValidation - 使用另一个对象中的属性进行验证

C#
千巷猫影 2023-07-09 17:11:20
我在 .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按预期工作。
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

也许何时可以在这里解决您当前的需求。但如果您需要编写更复杂的验证,那么您可以使用Must。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");

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


查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信