我正在尝试使用FluentValidation实现规则,其中两个属性相互依赖。它们是Unit
和UnitType
。 Unit
是一个字符串,UnitType
是一个枚举。我想要规则,如果填写Unit
,则UnitType
不能None (0)
,如果UnitType
不是None (0)
则Unit
必须填写。这是我迄今为止尝试的规则无济于事:
this.RuleFor(
p =>
p.Unit).NotEmpty().When(
l =>
(l.UnitType != UnitType.None)).WithMessage("Unit № must be filled out and must be less than 8 characters long when the Unit Type is selected");
this.RuleFor(
p =>
p.UnitType).NotEqual(UnitType.None).When(
l =>
!String.IsNullOrEmpty(l.Unit)).WithMessage("Unit Type must be selected when the Unit № is filled out");
无论我如何调整规则,我都会不断收到错误消息:'Unit Type'不能为空。由于我的自定义错误消息没有显示,我在想以某种方式跳过规则...
我很感激有关如何解决此问题的任何建议。
答案 0 :(得分:0)
好吧,在花了一些时间远离它并回到它之后,我相信我终于解决了。最初在我的帖子模型中,我将UnitType
属性视为非可空,即使它的默认值为UnitType.None
,也会触发验证。据我所知,MVC,不是 FluentValidation,看到它的非可空属性,忽略默认值,然后尝试使用表单帖子中的空值绑定属性。我可以理解为什么它会以这种方式运行,但不能帮助我们认为它不应该忽略默认值。
所以,我将属性更改为可以为空,现在我的两个规则就像我期望的那样工作。尽管如此,我对其实际工作方式并不过分满意,因为我希望在使用AutoMapper进行映射时能够进一步使用默认的自动生成的值,现在我已经拥有了确保在构造函数中设置与其相关的默认值。从长远来看,实际上是一个非问题,只要我不会错过在某个地方设置默认值。