验证FluentValidation中的整数列表

时间:2014-04-10 10:07:40

标签: fluentvalidation

如何使用流畅验证验证整数列表?

我的模特有:

 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;

指定自定义媒体资源名称

2 个答案:

答案 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);
    }
}