Строка FluentValidation NotNull против NotEmpty

первоначально при написании логики проверки для строк я решил использовать NotEmpty для любой строки, которая была необходима. При использовании. NotEmpty().Length (min, max) это приведет к возвращению двух ошибок вместо одной при передаче пустой строки.

Как можно предотвратить избыточные ошибки?

2 ответов


.Length (min, max) не вернет ошибку, если строка имеет значение null, но вернет ошибку, если строка пуста, а min больше 0. Существует два способа реализации требуемой строки с минимальной длиной больше 0.

типичный способ остановиться на первой ошибке - использовать каскадный метод:

    RuleFor(o => o.PropertyName)
        .Cascade(CascadeMode.StopOnFirstFailure)
        .NotEmpty() // Will return an error if null or empty
        .Length(2, 10) // Will only return an error if length == 1 or > than 10

однако для строк легче читать следующее:

    RuleFor(o => o.PropertyName)
        .NotNull()
        .Length(2, 10) // Will not return an error on null

сценарии проверки строк с использованием NotNull, NotEmpty и длина:

опционный с максимальной длиной:

    RuleFor(o => o.PropertyName).Length(0, max);


опционный с минимальной и максимальной длиной:

    RuleFor(o => o.PropertyName).Length(min, max);


требуется, но может иметь нулевую длину:

    RuleFor(o => o.PropertyName).NotNull()


обязательным и должен иметь ненулевую длину:

    RuleFor(o => o.PropertyName).NotEmpty();


требуется и имеет Макс длина:

    RuleFor(o => o.PropertyName).NotNull().Length(0, max);


требуется и имеет минимальную и максимальную длину:

    RuleFor(o => o.PropertyName).NotNull().Length(min, max);

другой способ предотвратить возникновение дополнительных ошибок - это установить каскадный режим.

RuleFor(x => x.PropName) .Cascade(CascadeMode.StopOnFirstFailure) .NotEmpty() .Length(min, max);