如何使Fluent验证与对象列表一起使用[重复]

问题描述 投票:1回答:1

首先,我已经尝试过this问题的步骤。

此类Post使用流畅的验证

public class Post
{
   //...
   public int? LampType { get; set; }
   public int? LampModel { get; set; }
   //...    
}

他的流利验证。它工作正常。

//...
RuleFor(x => x.LampType).NotNull().WithMessage(x => "LampType can't be null");
RuleFor(x => x).Must(p => LampType.Open.ID == p.LampType )
        .When(p => LampModel.NoCover.ID == p.LampModel ).WithMessage(x => "A closed Lamp needs a cover");
RuleFor(x => x).Must(p => LampType.Closed.ID == p.LampType )
        .When(p => LampModel.NoCover.ID != p.LampModel ).WithMessage(x => "A open Lamp can't have a cover");
//...

但我需要对此进行更新,现在我的帖子可以有倍数灯,所以我创建了这个:

public class newPost
{
   //...
   public IEnumerable<LampPostModel> Lamps { get; set; }
   //...
}

public class LampPostModel
{
   public int? LampType { get; set; }
   public int? LampModel { get; set; }
}

我在PostValidation上试过这个

{
   //...
   RuleFor(x => x.Lamps).SetCollectionValidator(new LampValidator());
   //...
}

这是新的LampValidator

{
   RuleFor(x => x.LampType).NotNull().WithMessage(x => "LampType can't be null");
   RuleFor(x => x).Must(p => LampType.Open.ID == p.LampType )
        .When(p => LampModel.NoCover.ID == p.LampModel ).WithMessage(x => "A closed Lamp needs a cover");
   RuleFor(x => x).Must(p => LampType.Closed.ID == p.LampType )
        .When(p => LampModel.NoCover.ID != p.LampModel ).WithMessage(x => "A open Lamp can't have a cover");
}

但是在这个改变之后,这不再起作用了。它拒绝第二条规则,即使不应该。似乎验证试图一次测试所有对象,而不是逐个测试

请求已经完成了这样的事情

Lamps[
   {open, nocover},
   {closed, glass}
];
c# asp.net .net fluentvalidation
1个回答
0
投票

似乎这个问题有点duplicated

我解决了对PostValidator这样做的问题

RuleForEach(x => x.Lamps).SetValidator(new LampPostValidator());

LampValidator

 When(p => p.LampModel== LampType.NoCover.ID, () =>
 {
     RuleFor(p => p).Must(p => p.LampType== LampType.Open.ID);
 });
 When(p => p.LampModel != LampType.NoCover.ID, () =>
 {
     RuleFor(p => p).Must(p => p.LampType == LampType.Closed.ID);
 });
© www.soinside.com 2019 - 2024. All rights reserved.