Fluent Validation - 将参数传递给集合验证器
Fluent Validation - pass parameter to collection validator
我在 ASP.NET MVC 应用程序中使用流畅的验证,但我遇到了问题。
这是我的规则:
RuleFor(x => x.SimpleList)
.SetCollectionValidator(new SimpleListValidator())
.When(x => x.Type == SimpleEnum.SpecificType);
我想将 x.Type 参数传递给 SimpleListValidator,我该怎么做?某种扩展方法?它应该看起来像:
RuleFor(x => x.SimpleList)
.SetCollectionValidator(new SimpleListValidator(x => x.Type))
.When(x => x.Type == SimpleEnum.SpecificType);
在为 属性 设置集合验证器后 - 您可以忘记这个事实,即主模型和 (n - 1)
子模型存在,但当前正在验证的子模型除外。而且 SetCollectionValidator
中无法将主模型作为参数传递。
所以你必须使用 RuleForEach
方法而不是设置集合验证器:
RuleForEach(x => x.SubEntities)
.Must((model, submodel) => IsValidFirst(submodel, model)) // your rules should go here to be applicable to each collection item
.WithMessage("The item with values {0}, {1} has duplicates in collection of {2} items",
(model, submodel) => submodel.Field1,
(model, submodel) => submodel.Field2,
(model, submodel) => model.SubEntities.Count); // for error message building you can access both model and submodel being validated
.Must((model, submodel) => IsValidSecond(submodel, model)) // yet another rule
.WithMessage("...")
.When(model =>
model.Type == SimpleEnum.SpecificType) // can access to main model only, but it is enough for your purposes
我想告诉子验证器事实的可能性,即父模型可能存在,应该在未来实现,但现在只有上面提到的唯一可行方法。
更新
您可以创建自定义 ModelBinder
,将每个子实体的 Parent
属性 设置为主实体值,并继续使用 SetCollectionValidator()
。
这是可能的,你可以这样做:
RuleFor(x => x.SimpleList)
.SetCollectionValidator(model => new SimpleListValidator(model))
.When(x => x.Type == SimpleEnum.SpecificType);
在您的 SetCollectionValidator class 中,您必须创建一个构造函数来接受您的模型作为参数(或您希望传递给验证器的任何其他内容)。请记住,您应该在 SimpleListValidator class.
中保留一个 parameter-less 构造函数
我在 ASP.NET MVC 应用程序中使用流畅的验证,但我遇到了问题。 这是我的规则:
RuleFor(x => x.SimpleList)
.SetCollectionValidator(new SimpleListValidator())
.When(x => x.Type == SimpleEnum.SpecificType);
我想将 x.Type 参数传递给 SimpleListValidator,我该怎么做?某种扩展方法?它应该看起来像:
RuleFor(x => x.SimpleList)
.SetCollectionValidator(new SimpleListValidator(x => x.Type))
.When(x => x.Type == SimpleEnum.SpecificType);
在为 属性 设置集合验证器后 - 您可以忘记这个事实,即主模型和 (n - 1)
子模型存在,但当前正在验证的子模型除外。而且 SetCollectionValidator
中无法将主模型作为参数传递。
所以你必须使用 RuleForEach
方法而不是设置集合验证器:
RuleForEach(x => x.SubEntities)
.Must((model, submodel) => IsValidFirst(submodel, model)) // your rules should go here to be applicable to each collection item
.WithMessage("The item with values {0}, {1} has duplicates in collection of {2} items",
(model, submodel) => submodel.Field1,
(model, submodel) => submodel.Field2,
(model, submodel) => model.SubEntities.Count); // for error message building you can access both model and submodel being validated
.Must((model, submodel) => IsValidSecond(submodel, model)) // yet another rule
.WithMessage("...")
.When(model =>
model.Type == SimpleEnum.SpecificType) // can access to main model only, but it is enough for your purposes
我想告诉子验证器事实的可能性,即父模型可能存在,应该在未来实现,但现在只有上面提到的唯一可行方法。
更新
您可以创建自定义 ModelBinder
,将每个子实体的 Parent
属性 设置为主实体值,并继续使用 SetCollectionValidator()
。
这是可能的,你可以这样做:
RuleFor(x => x.SimpleList)
.SetCollectionValidator(model => new SimpleListValidator(model))
.When(x => x.Type == SimpleEnum.SpecificType);
在您的 SetCollectionValidator class 中,您必须创建一个构造函数来接受您的模型作为参数(或您希望传递给验证器的任何其他内容)。请记住,您应该在 SimpleListValidator class.
中保留一个 parameter-less 构造函数