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。

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

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

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

<input maxlength="@Length">

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

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

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

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

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

  1. 如何在自定义指令中获取评估属性

    本文翻译自:How to get evaluated attributes inside a custom directive I'm trying to get an evaluated attri ...

  2. Spring MVC中获取当前项目的路径

    Spring MVC中获取当前项目的路径 在web.xml中加入以下内容 <!--获取项目路径--><context-param><param-name>webAp ...

  3. 在ASP.NET MVC 中获取当前URL、controller、action

    在ASP.NET MVC 中获取当前URL.controller.action URL的获取很简单,ASP.NET通用: [1]获取 完整url  (协议名+域名+虚拟目录名+文件名+参数) stri ...

  4. Spring mvc 中处理模型数据 ModelAndView

    Spring mvc 中处理模型数据  ModelAndView 原文: http://blog.csdn.net/jingyuan_/article/details/9625125 将模型数据暴露给 ...

  5. spring MVC中获取request和response

    spring MVC中获取request和response: Java代码   HttpServletRequest request = ((ServletRequestAttributes) Req ...

  6. pytorch中获取模型参数

    原文链接:pytorch中获取模型参数:state_dict和parameters两个方法的差异比较_造未来-CSDN博客 一.本文的模型案例 代码如下: import torch import to ...

  7. 如何在Java中获取系统属性?

    The System class in Java maintains a set of properties. These properties are stored in the form of k ...

  8. 不知道如何使用Hermit从Java本体中获取对象属性

    我正在尝试从一个类中获取一个对象属性,特别是:我试图了解一个类何时是其他类的一部分(可以在屏幕截图中看到所使用的结构). 我已经尝试在OWLClass对象(对象为" e")上使用O ...

  9. ASP.NET MVC中的模型装配 封装方法 非常好用

    下面说一下 我们知道在asp.net mvc中 视图可以绑定一个实体模型 然后我们三层架构中也有一个model模型 但是这两个很多时候却是不一样的对象来的 就拿微软的官方mvc例子来说明 微软的视图实 ...

最新文章

  1. python 画图 内存-python来做专项测试-内存测试
  2. 根据字段的不同内容分类汇总 - 球队的胜负次数统计
  3. 自由自在讲述小资与冰淇淋的美丽生活
  4. C#中怎样跨窗体调用事件-从事件订阅实例入手
  5. MongoDB BI Connector 实战指南
  6. Spring boot 之 动态的获取不同的实现类
  7. 地平线后端开发实习面经
  8. 与中石油分享SOA成功实践
  9. Memcache 提高缓存命中率
  10. iOS开发拓展篇—UIDynamic(捕捉行为)
  11. [UE4]暂停游戏、退出游戏、游戏输入模式
  12. BIOS、BootLoader、uboot对比
  13. 一文搞懂 Flink 的 Exactly Once 和 At Least Once
  14. java-如何反编译
  15. python飞机大战游戏素材_python实现飞机大战小游戏
  16. C# 格式化json移除空值,参数按照第一个字符的键值 ASCII 码递增排序(SM2签名)
  17. Alex Smith: An NFL quarterback on overcoming setbacks and self-doubt
  18. presto字符串转日期
  19. linux公社_又一个Linux发行版宣告死亡!曾经是最好的桌面版BSD操作系统
  20. 微信恋爱话术表白漫画脸头像制作生成小程序源码

热门文章

  1. ⑨③-不能浪费拥有的年轻资本
  2. 数据库开发基本操作-安装Sql Server 2005出现“性能监视器计数器要求”错误解决方法...
  3. 假装不知道有尽头(博弈论的诡计)
  4. 强制退出WinForm程序之Application.Exit和Environment.Eixt
  5. 入行AI,你需要一本Python机器学习入门
  6. laravel5.4 关于数据填充的知识
  7. JVM指令详解(上)
  8. 常用英文标点符号的使用
  9. 1578: [Usaco2009 Feb]Stock Market 股票市场
  10. 方案里最常用的集群拓扑图(包含:多机集群、负载均衡、双机)