только минимальная/максимальная длина должна быть проверена


Я использую фреймворк FluentValidation в моем ASP.NET проект MVC 4 для проверки как на стороне сервера, так и на стороне клиента.

Существует ли собственный (не взломанный) способ проверки длины строки только с максимальной длиной или только с минимальной длиной?

Например так:

var isMinLengthOnly = true;
var minLength = 10;
RuleFor(m => m.Name)
    .NotEmpty().WithMessage("Name required")
    .Length(minLength, isMinLengthOnly);

Шаблон сообщения об ошибке по умолчанию должен быть не

'Name' must be between 10 and 99999999 characters. You entered 251 characters.

Но

'Name' must be longer 10 characters. You entered 251 characters.

И атрибуты на стороне клиента должны поддерживаться, например, хаки, такие как RuleFor(m => m.Name.Length).GreaterThanOrEqual(minLength) (не уверен, что это работает) нет применимый.

2 3

2 ответа:

Вы можете использовать

RuleFor(x => x.ProductName).NotEmpty().WithMessage("Name required")
            .Length(10);

Чтобы получить сообщение

'Name' must be longer 10 characters. You entered 251 characters.

Если вы хотите проверить минимальную и максимальную длину

RuleFor(x => x.Name).NotEmpty().WithMessage("Name required")
                    .Must(x => x.Length > 10 && x.Length < 15)
                    .WithMessage("Name should be between 10 and 15 chars");

Если вы хотите проверить только минимальную длину:

RuleFor(x => x.Name).NotEmpty().WithMessage("Name required")
    .Length(10)
    .WithMessage("Name should have at least 10 chars.");

Если вы хотите проверить только максимальную длину:

RuleFor(x => x.Name).NotEmpty().WithMessage("Name required")
    .Length(0, 15)
    .WithMessage("Name should have 15 chars at most.");

Это документация API для второго (public static IRuleBuilderOptions<T, string> Length<T>(this IRuleBuilder<T, string> ruleBuilder, int min, int max)):

Сводка: определяет валидатор длины в текущем построителе правил, но только для строковых свойств. Проверка завершится неудачей, если длина строки находится за пределами указанного диапазона. Диапазон включен.

Параметры:

ruleBuilder: конструктор правил, на котором должен быть определен валидатор

мин:

Макс:

Параметры типа:

Т: тип проверяемого объекта

Вы также можете создать расширение, подобное этому (используя Must вместо Length):

using FluentValidation;

namespace MyProject.FluentValidationExtensiones
{
    public static class Extensiones
    {
        public static IRuleBuilderOptions<T, string> MaxLength<T>(this IRuleBuilder<T, string> ruleBuilder, int maxLength)
        {
            return ruleBuilder.Must(x => string.IsNullOrEmpty(x) || x.Length <= maxLength);
        }
    }
}

И использовать его так:

RuleFor(x => x.Name).NotEmpty().WithMessage("Name required")
    .MaxLength(15)
    .WithMessage("Name should have 15 chars at most.");