Получение правил максимальной длины строки 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 использует статические свойства, поэтому для каждого свойства необходимо вручную указать правило, которое проверяется по длине из атрибута метаданных свойства.