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

时间:2016-02-01 13:19:10

标签: servicestack fluentvalidation

我们希望在我们的Javascript数据输入表单中实现一个字符计数器,因此用户可以立即获得关于他输入了多少字符以及剩下多少字符的按键反馈(类似于“25/100”,表示当前字符串长度为25,允许的最大值为100。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

如果你想为客户端/服务器维护一个单一的引用源,我会采用元数据方法并提供一个服务,为所有类型返回客户端的最大长度,如:

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