zoukankan      html  css  js  c++  java
  • MVC中获取模型属性的Range和StringLength验证特性设置

    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写一些自定义的客户端验证。

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

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

  • 相关阅读:
    [记录]Python2.7使用argparse模块
    [记录]MySQL读写分离(Atlas和MySQL-proxy)
    [记录]Shell中的getopts和getopt用法
    [记录]CentOS搭建SVN服务器(主从同步)
    [记录]Zabbix3.4配置监控Oracle12c的存活状态和表空间使用率
    [记录]一则清理MySQL大表以释放磁盘空间的案例
    [原创]Oracle 12c的备份和恢复策略
    Linux awk用法
    Oracle数据库学习笔记
    oracle无法删除当前连接用户方法
  • 原文地址:https://www.cnblogs.com/SkyD/p/4053458.html
Copyright © 2011-2022 走看看