如何使用FluentValidation有条件地验证属性?

时间:2014-08-14 23:36:27

标签: c# asp.net-mvc fluentvalidation

我正在尝试使用FluentValidation实现规则,其中两个属性相互依赖。它们是UnitUnitTypeUnit是一个字符串,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'不能为空。由于我的自定义错误消息没有显示,我在想以某种方式跳过规则...

我很感激有关如何解决此问题的任何建议。

1 个答案:

答案 0 :(得分:0)

好吧,在花了一些时间远离它并回到它之后,我相信我终于解决了。最初在我的帖子模型中,我将UnitType属性视为非可空,即使它的默认值为UnitType.None,也会触发验证。据我所知,MVC,不是 FluentValidation,看到它的非可空属性,忽略默认值,然后尝试使用表单帖子中的空值绑定属性。我可以理解为什么它会以这种方式运行,但不能帮助我们认为它不应该忽略默认值。

所以,我将属性更改为可以为空,现在我的两个规则就像我期望的那样工作。尽管如此,我对其实际工作方式并不过分满意,因为我希望在使用AutoMapper进行映射时能够进一步使用默认的自动生成的值,现在我已经拥有了确保在构造函数中设置与其相关的默认值。从长远来看,实际上是一个非问题,只要我不会错过在某个地方设置默认值。