【问题标题】:Chaining rules that depend on each other相互依赖的链接规则
【发布时间】:2011-11-15 09:18:16
【问题描述】:

我在我的项目中使用Fluent Validation
在我的 ViewModel 中,我有一个字符串类型的属性,有效值只是表示正整数的字符串。
因此,我创建了一个简单的IntegerValidator 来检查字符串是否可以解析为整数。这行得通。
问题是,如何添加它必须是正整数的规则?我想使用现有的Greater Than Validator,但将其链接到我的字符串属性的规则会将其比较为string,而不是作为解析的int。如何做到这一点?

我想做的示例(注意ToInt()):

RuleFor(x => x.BatchNumber).SetValidator(new IntegerValidator())
                           .ToInt().GreaterThan(0);

【问题讨论】:

  • 这真的很有道理!但是,我想知道 ToInt 的作用应该是什么。正如我所看到的,它应该将RuleBuilder<X, string> 转换为RuleBuilder<X, int>,并确保在验证时将验证值转换为int。但是......方法链应该返回一个RuleBuilder<X, string>。对?因此,必须有一种方法可以指示连续的int 规则(如GreaterThan)进行int 验证,但返回string 规则构建器。我担心这超出了 FluentValidation 的当前功能。
  • @GertArnold:嗯,我认为ToInt 没有多大意义。我实际上并不关心 如何 它将如何工作,只是 那个 我可以使用 GreaterThan 并将一个 int 传递给 GreaterThan
  • 好吧,我的主要观点是,在当前 Fluent Validation 的思维模式中,这可能是概念问题。
  • 也许创建一个包含可选最小和最大参数的 IntegerValidator 替换?我使用类似的东西(尽管不是 Fluent Validation),并使用可为空的整数作为边界,以便可以独立设置上限和下限或完全禁用。

标签: c# .net fluentvalidation


【解决方案1】:

您总是可以使用自定义方法...

RuleFor(x=>x.BatchNumber).Must(BeAPositiveIntegerString);

private bool BeAPositiveIntegerString(string batchNumber)
{
    // check both parse ability and greater than (once parsed)
}

可重用性较低,但会起作用...

【讨论】:

  • 当然,我可以做到,毫无疑问。但这正是我想要避免的,也是我一开始就问的原因:)
  • 我找不到将RuleBuilder<T, string> 转换为RuleBuilder<T, int> 的方法。这些类的层次结构需要对 FluentValidator 的代码进行深刻的更改,但我要向他们提一下;我可以看到类似的用例。在这种特殊情况下(给您另一个非答案),您始终可以链接一个验证器来检查字符串中的负号。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多