在前面的文章中介绍了用户的注册及登录功能,在注册用户时可以通过代码的形式限制用户名及密码的格式,如果不符合要求那么就无法完成操作,如下图:
该功能的原理是Identity基于的Entity Framework组件在添加用户之前对用户提交数据进行校验后给出的错误信息。
数据校验功能在每一个软件系统中都是非常必要的,为了避免用户输入无效或非法数据导致的系统错误,需要在数据进行处理或持久化之前对其进行验证确保数据的正确、有效性。
本文将从以下几点来介绍ASP.NET MVC中的模型验证机制:
● 输入验证
● .NET 的验证简介
● ASP.NET MVC的后端模型验证
● ASP.NET MVC的客户端模型验证
● 关于ASP.NET MVC的客户端验证
● 自定义ASP.NET MVC中的模型验证
输入验证
输入验证的目的就是用来判断一个变量是否能够满足规定的要求,这里既然提到了“判断”那么使用程序来实现时最直接的方式就是通过判断语句来完成,如:
但是在.Net中是否有一种统一的方式来实现数据的验证呢?否则每次通过判断语句来写验证代码既不能重用又影响阅读。
.NET 的验证简介
在.Net中提供了一种基于特性的数据类型标记(DataAnnotations)、验证机制。
1、数据类型的标记:
.Net中有一个名为system.componentmodel.dataannotations的类库,里面包含了很多特性(Attribute)。这些特性用于标记.Net类型中的属性的数据类型信息。比如数据长度、格式、能否为空等等。
下图为该类库中的部分类型,从中可以看到如信用卡、邮件地址、最大/最小长度等特性类型:
数据标记特性(Data Annotation attributes)有三种类型,分别是:
● 验证特性:用于执行验证规则,如邮箱地址、数据类型、数据长度、数字区间、正则表达式等验证特性。
● 展示特性:用于指定被标记的类型或属性如何在UI上展示。
● 模型关系特性:用于指定类成员与其它类型的关系,如外键特性等。
下图是通过特性对一个实体类型的name属性进行标记的结果,从标记的名称可以轻易看出该name属性是必填的并且最大长度为30,展示的名称为“名称”。
但需要注意的是system.componentmodel.dataannotations所提供的特性仅仅是一种描述,它不会因为你限制了一个字符串的长度就无法给它赋值超出限制的字符串,它必须手动调用验证方法或者在ASP.NET MVC、EF中使用。(可参考:https://stackoverflow.com/questions/6496705/how-do-data-annotations-work)
关于dataannotations提供的特性类型可参考:https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx
2、数据类型的验证
当使用数据特性标记对类型完成标记后,还需要通过专门的验证类型才可以完成验证,该类型同样存在于system.componentmodel.dataannotations程序集中名为Validator,下图是Validator的定义,从其描述来看该类用于对使用ValidationAttribute特性标记的类型、属性、方法进行验证:
3、类型验证示例
通过一个Console程序来演示如何使用.Net中的数据验证:
首先创建一个Console程序,并添加System.ComponentModel.DataAnnotations程序集的引用,然后编写以下代码:
运行后将输出以下错误信息:
添加显示特性后:
优化了验证提示信息:
4、自定义验证方式:
系统内置的数据验证特性均是继承至ValidationAttribute类型,下面就通过继承该类型来实现一个自己的数据验证方式:
首先添加一个继承ValidationAttribute的类型,并重写其IsValid方法,该方法中包含数据验证的逻辑,并设置相应的错误信息:
然后在相应的类属性上应用该特性:
验证结果:
关于自定义验证特性可参考:https://msdn.microsoft.com/en-us/library/cc668224.aspx
ASP.NET MVC的模型验证