Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将多个规则合并为一个规则_C#_Fluentvalidation - Fatal编程技术网

C# 将多个规则合并为一个规则

C# 将多个规则合并为一个规则,c#,fluentvalidation,C#,Fluentvalidation,我有以下规则: RuleFor(x => x.FromNumber).NotEmpty().GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired); 属性FromNumber的类型为int?。上面的问题是,CustomState仅设置为大于。如果该值为null或0,CustomState为null 如果我将上述内容更改为以下内容,则规则仍按预期工作:

我有以下规则:

RuleFor(x => x.FromNumber).NotEmpty().GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired);
属性
FromNumber
的类型为
int?
。上面的问题是,
CustomState
仅设置为
大于
。如果该值为null或0,
CustomState
为null

如果我将上述内容更改为以下内容,则规则仍按预期工作:

RuleFor(x => x.FromNumber ?? 0).GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired);

但是,有没有更好的方法将两个规则合并为一个规则而不是使用空条件运算符?

使用多个预定义的验证规则而不是一个自定义规则的原因如下:

  • 在MVC中正确生成客户端验证属性
  • 具有不同的错误消息(通过使用默认错误消息或
    WithMessage
    方法)
  • 1-st原因不是您的情况,因为您在
    条件时使用了
    ——它取消了为受影响规则生成的任何客户端属性

    2-nd对于您的案例来说并不重要,因为如果需要,您可以将错误消息合并为一条

    因此,您可以将规则组合为单个谓词规则:

    RuleFor(x => x.FromNumber)
        .Must(x => x != null && x > 0)
        .When(x => x.NumbersRequired)
        .WithState(x => MyErrorEnum.FromNumberRequired);
    
    p.S.语法如下:

    RuleFor(x => x.FromNumber ?? 0)
    

    在构造错误字典时,不仅会更改已验证的值,而且还会以不可预知的方式更改引用的属性名。仅在
    RuleFor
    /
    RuleForEach
    方法中使用属性链表达式。如果您喜欢使用这样的复杂表达式,请不要忘记在
    .WithName()
    方法中指定实际的属性名称。

    我将如何实现此规则:
    RuleFor(x=>x.ToNumber).NotEmpty().GreaterThan(x=>x.FromNumber)
    ?@Ivan MarkDebono使用另一个访问模型的重载:
    RuleFor(x=>x.ToNumber).Muxt((model,x)=>x!=null&&x>model.FromNumber);