如何使用流畅验证验证整数列表?
我的模特有:
public List<int> WindowGlassItems { get; set; }
模型验证器
RuleFor(x => x.WindowGlassItems).SetCollectionValidator(new WindowGlassItemsValidator());
public class WindowGlassItemsValidator : AbstractValidator<int>
{
public WindowGlassItemsValidator()
{
RuleFor(x=>x).NotNull().NotEqual(0).WithMessage("GLASS REQ");
}
}
我得到了:
无法自动确定表达式x =&gt;的属性名称X。请通过调用&#39; WithName&#39;
指定自定义媒体资源名称答案 0 :(得分:3)
您看到该错误,因为RuleFor方法期望指定属性。我无法让CollectionValidators像你一样使用原始类型。相反,我使用Must
这样的自定义验证方法。
我使用这种方法的唯一问题是我无法避免在2次验证中重复出现错误消息。如果您在列表为空时不需要它,则可以在NotNull
调用后将其保留。
RuleFor(x => x.WindowGlassItems)
//Stop on first failure to avoid exception in method with null value
.Cascade(CascadeMode.StopOnFirstFailure)
.NotNull().WithMessage("GLASS REQ")
.Must(NotEqualZero).WithMessage("GLASS REQ");
private bool NotEqualZero(List<int> ints)
{
return ints.All(i => i != 0);
}
答案 1 :(得分:1)
我对List有同样的问题,这是我的解决方案:
RuleFor(rule =&gt; rule.MyListOfMyEnum).SetCollectionValidator(new EnumValidator());
public class EnumValidator<T> : AbstractValidator<T>
{
public EnumValidator(params T[] validValues)
{
var s = validValues.Length == 0 ? "---" : string.Join(",", validValues);
RuleFor(mode => mode).Must(validValues.Contains).WithMessage("'{PropertyValue}' is not a valid value. Valid are [{0}].", s);
}
public EnumValidator()
{
var s = typeof (T).Name;
RuleFor(mode => mode).IsInEnum().WithMessage("'{PropertyValue}' is not a valid value for [{0}].", s);
}
}