c# 数据标注与数据校验
数据标注(DataAnnotation)是类或类成员添加上下文信息的一种方式,在C#通常用特性(Attribute)类来描述。它的用途主要可以分为下面这三类:
- 验证Validation:向数据添加验证规则
- 显示Display:指定数据如何呈现给用户
- 模型Modelling:添加关于用法和与其它类的关系信息
下面是一个用来验证和展现用户信息的一个Model:
classKid { [Range(0,18)]//年龄不能超过18岁,不能为负数 publicintAge{get;set;} [StringLength(MaximumLength=50,MinimumLength=3)]//名称的长度不能超过50,不能小于3 publicstringName{get;set;} [DataType(DataType.Date)]//生日将作为日期展示(不带时间) publicDateTimeBirthday{get;set;} }
数据标注的显示用途主要在早期的ASP.NET和ASP.NETMVC等框架中使用。例如,在ASP.NETMVC中,Razor引擎会根据Model属性的DataType特性动态生成不同类型的表单元素。不过,现在这类用途除了WPF(比如EditableAttribute)已经过时很少用了。
数据标注用来验证数据的合法性是最常见的用法,在ASP.NETCore/Mvc中,数据作为表单Model提交时,框架会对Model数据自动进行校验,也可以手动调用ModelState.IsValid()来判断数据是否合法。
自定义校验特性
自定义一个校验特性很简单,创建一个继承ValidationAttribute的类,然后重写它的IsValid方法。示例:
[AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=false)] publicclassEvenNumberAttribute:ValidationAttribute { publicoverrideboolIsValid(objectinput) { if(input==null) returnfalse; if(!int.TryParse(input.ToString(),outintval)) returnfalse; returnval%2==0; } }
然后这个特性可以这么用:
publicclassModel { [EvenNumberAttribute(ErrorMessage="数字必须是偶数")] publicintMyNumber{get;set;} }
除了这自定义校验的方式,C#还提供了一个CustomValidation特性,也是用来自定义数据校验的,它是通过反射的方式来实现的。示例:
publicclassModel { [CustomValidation(typeof(MyCustomValidation),"IsNotEvenNumber")] publicintMyNumber{get;set;} } publicstaticclassMyCustomValidation { publicstaticValidationResultIsNotEvenNumber(objectinput) { varresult=newValidationResult("数字必须是偶数"); if(input==null||!int.TryParse(input.ToString(),outintval)) returnresult; returnval%2==0?ValidationResult.Success:result; } }
C#内置了很多常用数据校验特性类,比如最常用的RequiredAttribute、StringLengthAttribute、RangeAttribute等。
手动执行数据校验
大多数时候,数据校验都是由框架(如ASP.NETCore)帮我们做了,但有时候我们想手动执行校验数据怎么做呢?简单说,使用Validator类即可,但也不是想像的那么直接。数据校验需要提供检验的信息,比如校验规则、需要校验的属性及未通过显示的错误信息等,而这些需要由另一个类来从待校验的实例中提取作为上下文,它是ValidationContext,所以需要先创建ValidationContext对象:
ValidationContextvc=newValidationContext(objectToValidate);
创建好这个上下文对象就可以对数据进行多种方式的校验了,比如校验对象的所有属性:
ValidationContextvc=newValidationContext(objectToValidate); ICollectionresults=newList (); boolisValid=Validator.TryValidateObject(objectToValidate,vc,results,true);
也可以只校验对象的指定属性:
ValidationContextvc=newValidationContext(objectToValidate); ICollectionresults=newList (); boolisValid=Validator.TryValidatePropery(objectToValidate.PropertyToValidate,vc,results,true);
返回值isValid表示是否所有数据都验证通过,验证失败的信息会放到results结果集。
看到这,我觉得手动执行校验还是有点麻烦,创建ValidationContext对象这一步如果也封装在Validator类的方法内,岂不是简洁一些?
作者:精致码农
出处:http://cnblogs.com/willick
联系:liam.wang@live.com
以上就是c#数据标注与数据校验的详细内容,更多关于c#数据标注与数据校验的资料请关注毛票票其它相关文章!