【问题标题】:How to conditionally validate properties using FluentValidation?如何使用 FluentValidation 有条件地验证属性?
【发布时间】:2014-08-14 23:36:27
【问题描述】:

我正在尝试使用 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' must not be empty.由于我的自定义错误消息没有显示,我在想以某种方式跳过了规则...

如果有任何关于如何解决此问题的建议,我将不胜感激。

【问题讨论】:

    标签: c# asp.net-mvc fluentvalidation


    【解决方案1】:

    好吧,在花了一些时间从这个问题上回来之后,我相信我终于解决了这个问题。最初在我的帖子模型中,我将UnitType 属性设置为不可为空,这就是触发验证的原因,即使它的默认值为UnitType.None。据我所知,MVC,not FluentValidation,认为它是不可为空的属性,忽略默认值,然后尝试使用表单帖子中的空值绑定该属性。我可以理解为什么它会这样,但不禁认为它不应该忽略默认值。

    所以,我将属性更改为可为空,现在我的两个规则可以按预期工作。尽管如此,我对它的实际工作方式并不太满意,因为我希望在使用 AutoMapper 进行映射时进一步使用默认的 auto-generated 值,现在我必须确保在相关的构造函数中设置默认值。从长远来看实际上不是问题,只要我不会错过在某处设置默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多