Получение правил максимальной длины строки FluentValidation и их максимальных значений

Мы хотим реализовать счетчик символов в нашей форме ввода данных Javascript, чтобы пользователь сразу же получал обратную связь о количестве набранных им символов и количестве оставленных им символов (что-то вроде "25/100", что означает, что текущая длина строки равна 25 и 100 - максимально допустимый).

Для этого я хотел бы написать сервис, который возвращает список имен свойств dto и их максимально допустимую длину.

{Name='SmallComment', MaxLength=128}
{Name='BigComment', MaxLength=512}

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

Какое бы решение ни было наилучшим, цель состоит в том, чтобы хранить максимальную длину для каждого свойства в одном месте, чтобы изменение этой длины влияло на правило проверки и данные службы, передаваемые клиенту javascript.

1 ответ

Решение

Если вы хотите сохранить единый источник ссылок для клиента и сервера, я бы использовал подход метаданных и предоставил бы Сервис, который возвращает клиенту максимальную длину для всех типов, что-то вроде:

public class ValidationMetadataServices : Service
{
    public object Any(GetFieldMaxLengths request)
    {
        return new GetFieldMaxLengthsResponse {
            Type1 = GetFieldMaxLengths<Type1>(),
            Type2 = GetFieldMaxLengths<Type2>(),
            Type3 = GetFieldMaxLengths<Type3>(),
        };        
    }

    static Dictionary<string,int> GetFieldMaxLengths<T>()
    {
        var to = new Dictionary<string,int>();
        typeof(T).GetPublicProperties()
          .Where(p => p.FirstAttribute<StringLengthAttribute>() != null)
          .Each(p => to[p.PropertyName] = 
              p.FirstAttribute<StringLengthAttribute>().MaximumLength);
        return to;
    }
} 

Но FluentValidation использует статические свойства, поэтому для каждого свойства необходимо вручную указать правило, которое проверяется по длине из атрибута метаданных свойства.

Другие вопросы по тегам