ASP.NETMVC Model验证()

前言

上篇主要讲解ModelValidatorProvider和ModelValidator两种类型的自定义实现,然而在MVC框架中还给我们提供了其它方式来进行Model验证,也就是本篇的主题,使用框架提供给我们的一系列的特性类型来进行Model验证,当然也是可以自定义的,在下面的演示示例中,我会使用我们自己自定义的特性类型(继承自ValidationAttribute类型)到自定义Model绑定器中来模拟一下实现。

Model验证

  • Model验证简单运用示例

  • ModelValidator使用生成过程

  • 自定义实现DefaultModelBinder进行验证

  • 自定义ModelValidatorProvider 和ModelValidator 

  • ValidationAttribute特性类使用

  • 自定义ValidationAttribute特性类的示例实现

 

ValidationAttribute特性类使用

我们首先看一下ValidationAttribute类型的定义,示例代码1-1。

代码1-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public abstract class ValidationAttribute: Attribute
    {
        protectedValidationAttribute();
        protectedValidationAttribute(Func<string> errorMessageAccessor);
        protectedValidationAttribute(string errorMessage);
  
        // 摘要:
        //     获取或设置一条在验证失败的情况下与验证控件关联的错误消息。
        //
        // 返回结果:
        //     与验证控件关联的错误消息。
        public string ErrorMessage { get;set; }
        public string ErrorMessageResourceName { getset; }
        public Type ErrorMessageResourceType { getset; }
        protectedstring ErrorMessageString { get; }
        public virtual stringFormatErrorMessage(string name);
        public ValidationResult GetValidationResult(object value, ValidationContextvalidationContext);
        //
        // 摘要:
        //     确定对象的指定值是否有效。
        //
        // 参数:
        //   value:
        //     要验证的对象的值。
        //
        // 返回结果:
        //     如果指定的值有效,则为 true;否则,为 false。
        public virtual bool IsValid(object value);
        protectedvirtual ValidationResultIsValid(object value, ValidationContextvalidationContext);
        public void Validate(objectvalue, string name);
        public void Validate(objectvalue, ValidationContext validationContext);
}

ValidationAttribute类型就是下面示例中所有应用在Model属性上特性类型的基类,在上面的ValidationAttribute类型中ErrorMessage属性表示验证错误所显示信息,IsValid()方法则是表示验证的值是否通过,下面我们看一下框架给我们提供的Model验证特性类的简单示例。

首先我们还是使用ASP.NETMVC Model验证(一)中的示例代码,看一下ViewModel使用了验证特性类后的定义,示例代码1-2.

代码1-2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace MvcApplication.Models
{
    ///<summary>
    /// ViewModel-用户注册信息
    ///</summary>
    public class RegistrationInformation
    {
        [Required]
        public string ID { getset; }
        [Required]
        public string UserID { getset; }
        [Required]
        [StringLength(10)]
        public string Password1 { get;set; }
        [Compare("Password1")]
        public string Password2 { get;set; }
         
        public string Name { getset; }
    }
}

在代码1-2中,我们看到了一些应用于Model属性上的特性类,下面简单的说一下这几种类型的含义。

Required:[Required],表示此属性不得为空(包括空字符串),当然了也可以通过设置内部的AllowEmptyStrings属性为true后,则视为可以为空。

StringLength:[StringLength(10)],表示此属性值的字符串最大长度不能超过10。

Compare:[Compare(“Password1”)],表示此属性的值必须和指定属性的值相同,示例中就是Password2的值必须和Password1属性的值相同,不然就会提示验证的错误信息

下面来一下项目运行后的结果图,

图1

图1中故意输入的这些数值,看下图2是验证后的结果

图2

自定义ValidationAttribute特性类的示例实现

这一小节我们直接来看自定义Model验证特性类型,直接来看定义的示例代码1-3.

代码1-3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace MvcApplication.ModelValidators
{
    [AttributeUsage(AttributeTargets.Property,AllowMultiple=true,Inherited=false)]
    public class CustomModelValidatorAttribute:ValidationAttribute
    {
  
        public override boolIsValid(object value)
        {
            if(string.IsNullOrEmpty((string)value)|| string.Compare((string)value,"jinyuan"true) == 0)
            {
                ErrorMessage = "不能为空,或名称不合法!";
                returnfalse;
            }
            else
            {
                returntrue;
            }
        }
    }
}

这里为什么要重写基类的IsValid()方法,可能MVC框架会调用这个方法来判断当前值是否通过验证,这里说一句题外话,在MVC框架中我翻看过默认绑定器类型的实现代码,并没有找到对Model验证特性类的调用,哪位大神知道的话告知一下小弟感激不尽。

现在我们再修改一下代码1-2中的定义,示例代码1-4.

代码1-4

1
2
        [CustomModelValidator]
        public string Name { getset; }

修改过后我们看一下结果图3和图4.

图3

图4

看到这里,有点不死心,想模拟实现一下默认绑定器的内部实现,这部分内容仅供参考,示例代码1-5.

代码1-5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public class CustomModelValidatorAttributeModelBinder: DefaultModelBinder
    {
        protectedoverride voidSetProperty(ControllerContextcontrollerContext, ModelBindingContextbindingContext, PropertyDescriptorpropertyDescriptor, object value)
        {
            base.SetProperty(controllerContext,bindingContext, propertyDescriptor, value);
            foreach(Attribute att inpropertyDescriptor.Attributes)
            {
                if(att is ModelValidators.CustomModelValidatorAttribute)
                {
                    ModelValidators.CustomModelValidatorAttribute mva = att as ModelValidators.CustomModelValidatorAttribute;
                    if(!mva.IsValid(value))
                    {
                       bindingContext.ModelState.AddModelError(propertyDescriptor.Name,mva.ErrorMessage);
                    }
                }
            }
        }
    }

在代码1-5中我们根据PropertyDescriptor类型的参数获取到应用在Model属性上的所有特性类,然后筛选到我们自定义的类型,进行一个验证判断然后将其错误信息添加到ModelState中,需要把我们自定义的这个Model绑定器注册到系统中,运行的时候按照图3的输入,结果就跟图4一样。同样的都能实现功能,这里只是让大家对默认的绑定器营造个遐想的空间。

本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1438617,如需转载请自行联系原作者

ASP.NETMVC Model验证(五)相关推荐

  1. asp.net model 验证和取出 ErrorMessage 信息

    为什么80%的码农都做不了架构师?>>>    public class Users{public int Id { get; set; }public string Name { ...

  2. ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator

    旨在为目标Action方法的执行绑定输入参数的Model绑定过程伴随着对Model的验证.借助相应的验证特性,我们可以直接以声明的方式在Model类型上定义验证规则,这些规则将会作为Model元数据的 ...

  3. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

    对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来 ...

  4. ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator

    对于ASP.NET MVC基于标注特性的Model验证,很多人只知道应用在数据类型及其属性上用于定义验证规则和错误消息的ValidationAttribute.通过<ASP.NET MVC以Mo ...

  5. ASP.NET MVC Model元数据(五)

    ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...

  6. 【飞秋】Asp.net MVC2 model验证 看似美好,实则让人失望。

    最近几天看了一下Asp.net MVC2的model验证,初始的感觉让我眼前一亮,于是去看了看它的源代码,Validation和Metadata部分应该是从Dynamic Data哪里得到的灵感,一切 ...

  7. 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式

    本文属转载,来源:http://www.byywee.com/page/M0/S868/868615.html关于Model验证官方资料:http://msdn.microsoft.com/zh-cn ...

  8. ASP.NET MVC Model绑定(五)

    ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了解说,本篇将会对IValueProvider的使用做个基础的演示样例解说,读 ...

  9. [ASP.NET MVC 小牛之路]16 - Model 验证

    上一篇博文 [ASP.NET MVC 小牛之路]15 - Model Binding 中讲了MVC在Model Binding过程中如何根据用户提交HTTP请求数据创建Model对象.在实际的项目中, ...

最新文章

  1. 九个 Console 命令,让 js 调试更简单
  2. 蓝桥杯 历届试题 九宫重排
  3. Escape字符总结
  4. 【部署】Nginx长连接配置
  5. c++产生死锁的必要条件?已经如何预防死锁?
  6. Unity性能优化 – 脚本篇
  7. 大数据开发上岗基本要求
  8. 惠普打印机怎么无线连接电脑_惠普SPECTRE X360 13笔记本电脑怎么样,值得买吗
  9. Logistic Regression 之 Sigmoid
  10. elasticsearch aggregations_Elasticsearch聚合的嵌套桶如何排序
  11. linux 运行jar main,Maven打包生成jar包并在linux下启动main方法
  12. linux系统开启多路径,Linux系统怎么配置多路径
  13. 当UINavigationController作为UIViewController之后如何去除上部的空白
  14. easyar 实现模型的旋转和缩放
  15. 手机拍照怎么识别文字
  16. 数字图像处理,相位相关算法解决图像的刚性平移问题
  17. 【12306刷票必备!!!】12306订票助手----无所不能的谷歌浏览器chrome插件
  18. A blockchain‑based smart home gateway architecture for preventing data forgery
  19. ftp服务器连接时间太长(耗时20s或40s)问题解决(超详细图文教程)
  20. 制药机械设备远程监控及故障预警维护管理系统

热门文章

  1. linux 病毒 sfewfesfs
  2. 使用dmidecode查看服务器的内存条使用情况
  3. 解决ScrollView嵌套RecyclerView出现item显示不全的问题
  4. 解决codeforces访问慢的问题
  5. visual studio 容器工具首次加载太慢 vsdbg\vs2017u5 exists, deleting 的解决方案
  6. vue项目初始化时npm run dev报错webpack-dev-server解决方法
  7. 在C#中,当您在null对象上调用扩展方法时会发生什么?
  8. 如何重置/删除chrome的输入突出显示/焦点边框? [重复]
  9. JavaScript截断/切片/修剪掉字符串中的最后一个字符
  10. 经常玩电脑正确的坐姿_疼痛科专家告诫,疼痛是疾病的信号,经常腰腿疼,可能是身体在呼救...