首先,我已经尝试过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}
];
似乎这个问题有点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);
});