博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC中获取模型属性的Range和StringLength验证特性设置
阅读量:6983 次
发布时间:2019-06-27

本文共 1159 字,大约阅读时间需要 3 分钟。

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

于是乎,只能通过反射来获取特性的定义信息了,以下代码能够获取到该属性定义的所有特性:

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

然后我们遍历之,寻找我们要的类型,这里以Range为例:

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

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

然后就可以取值了:

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

这里我们需要double类型的值,所以不管传入的是int还是double类型参数,统一使用转换的方式转换为double。

这样我们就可以在发往客户端页面中进行基本的限制了:

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

还可以结合JS写一些自定义的客户端验证。

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

 

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

转载于:https://www.cnblogs.com/SkyD/p/4053458.html

你可能感兴趣的文章
Android中的四种动画(一)
查看>>
[C#]如何使用ThreadPool
查看>>
npm加载包报错 :syscall access
查看>>
字符串的基本操作
查看>>
gcc static静态编译选项提示错误:/usr/lib/ld:cannot find -lc
查看>>
web网页前端制作中的SEO方法
查看>>
jq鼠标经过之后图片效果(兼容ie8)
查看>>
动画跳转
查看>>
【酷熊科技】工作积累 ----------- 动画播放 直接写代码控制的
查看>>
2、观察者模式
查看>>
第三章:回收方法区
查看>>
手动安装ssh
查看>>
oracle—新建用户
查看>>
设计模式基础(二):目标与原则
查看>>
去掉input【type=number】默认的上下箭头
查看>>
Linux 源码安装apache 与常见错误解决
查看>>
zookeeper 节点讲解以及实际项目运用
查看>>
asp.net core 官方文档
查看>>
vue.nextTick简单的用法
查看>>
OpenCV人脸识别
查看>>