MVC中获取模型属性的Range和StringLength验证特性设置

MVC中的客户端及服务端模型验证信息都以ModelMetadata类型做为承载,在得到属性的ModelMetadata以后(还不知道怎么获取ModelMetadata的童鞋请自行恶补),咱们能够轻松获得一些咱们在模型中定义的特性,好比显示名称、是否只读、是否必须、注释、数据类型等,可是并不包括Range和StringLength这两个须要验证的特性,我把ModelMetadata对象翻个底朝天也没找到设置的值。函数

因而乎,只能经过反射来获取特性的定义信息了,如下代码可以获取到该属性定义的全部特性:spa

var attrs = metadata.ContainerType.GetProperty(metadata.PropertyName).CustomAttributes;

而后咱们遍历之,寻找咱们要的类型,这里以Range为例:code

foreach (var f in attrs)
            {
                if (f.AttributeType == typeof(RangeAttribute) && f.ConstructorArguments[0].ArgumentType != typeof(Type))
                {
                    //TODO:对其取值
                }
            }

代码中首先判断类型是否一致,接着判断第一个构造参数是否不为Type类型(Range特性有三个构造函数,其中第一个参数为Type类型的max和min值能够是任何类型,在这里咱们不需处理这个构造函数的数据,只对另外两种传输int或double的构造函数感兴趣)。对象

而后就能够取值了:blog

double Min = ((IConvertible)f.ConstructorArguments[0].Value).ToDouble(null);
double Max = ((IConvertible)f.ConstructorArguments[1].Value).ToDouble(null);

这里咱们须要double类型的值,因此无论传入的是int仍是double类型参数,统一使用转换的方式转换为double。input

这样咱们就能够在发往客户端页面中进行基本的限制了:class

<input type="number" name="points" min="@Min" max="@Max" />

同理能够取来StringLength的信息用来限制文本输入框的可输入字符长度:foreach

<input maxlength="@Length">

还能够结合JS写一些自定义的客户端验证。遍历

服务端的模型验证不用咱们操心,这两个特性会在验证时正确触发的。meta

 

使用这个技巧,你还能够实现一些自定义的特性,以控制客户端的页面功能。

相关文章
相关标签/搜索