获取 FluentValidation 最大字符串长度规则及其最大值

Obtaining FluentValidation max string length rules and their max values

我们想在我们的 Javascript 数据输入表单中实现一个字符计数器,这样用户就可以立即得到关于他输入了多少字符以及还剩下多少字符的击键反馈(比如“25/ 100",表示当前字符串长度为 25,100 是允许的最大值。

为此,我想编写一个服务,其中 returns dto 属性 名称列表及其最大允许长度。

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

我能想到的最好的方法是为该 dto 创建一个验证器实例并遍历它以提取 .Length(min,max) 规则。我还有其他想法,比如将最大长度存储在属性中,但这需要重写所有验证器以根据属性设置规则。

无论哪种解决方案最好,目标是将每个 属性 的最大长度存储在一个地方,以便更改该长度会影响验证规则和传递给 [=20] 的服务数据=] 客户.

如果你想为两者维护单一参考源 client/server 我会采用元数据方法并提供服务 returns 所有类型的客户端的最大长度,比如:

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 使用静态属性,因此需要为每个 属性 手动指定一个规则,以根据 属性 元数据属性的长度进行验证。