在上一篇文章中,我介绍了企业库的Validation模块的基本信息、使用方法,同时对企业库的内置验证器的实现及验证器的特性类实现进行了简单的分析,今天我将继续前一篇文章,介绍Validation模块内置的多种验证器的使用进行介绍。
(注:本文仅仅就Validation模块的各种验证器根据我个人的理解进行介绍,如果有误欢迎大家指出!)
0、验证器的命名参数
在上一篇文章中我已经介绍过验证器的特性类的层次:
BaseValidationAttribute->ValidatorAttribute ->ValueValidatorAttribute ->具体验证器特性类
1)ErrorMessage,继承自ValidationAttribute,在Validation模块中没用使用。
2)ErrorMessageResourceName,继承自ValidationAttribute,在Validation模块中没用使用。
3)ErrorMessageResourceType,继承自ValidationAttribute,在Validation模块中没用使用。
4)MessageTemplate,验证错误消息模板,继承自BaseValidationAttribute。
5)MessageTemplateResourceName,验证错误消息模板所在资源名,继承自BaseValidationAttribute。
6)MessageTemplateResourceType,验证错误消息模板所在资源类型,继承自BaseValidationAttribute。
7)Negated,否定验证逻辑,继承自ValueValidatorAttribute。
8)Ruleset,验证规则集,继承自BaseValidationAttribute。
9)Tag,验证结果,继承自BaseValidationAttribute。
这些参数在每个具体的验证器中都是通用的,都被设置为可选的命名参数,使用者可以根据业务需求指定需要的参数。
例如指定错误消息:MessageTemplate = "名称中必须包含kyo字符串!",具体参数的介绍可以查看上一篇文章。
下面介绍每个验证器的时候就不介绍了。
1、ContainsCharactersValidator——是否包含字符串验证
这个验证器主要是验证字符串对象中是否包含指定的字符串,其具体用法如下:
1
2
3
4
|
[ContainsCharactersValidator("kyo")]
[ContainsCharactersValidator("kyo", MessageTemplate = "名称中必须包含kyo字符串!")]
[ContainsCharactersValidator("kyo", ContainsCharacters.All)] //ContainsCharacters.Any
public string Name { get; set; }
|
这个验证器有4个重载的构造函数,接收3类参数:
1)字符串characterSet,指定要求包含的字符串
2)枚举ContainsCharacters,包含字符串验证枚举,有2个值:All(待验证的字符串必须包含指定的字符串中所有字符),Any(待验证的字符串只需包含指定的字符串中一个字符)
3)命名参数
2、DateTimeRangeValidator——时间范围验证
这个验证器主要是验证日期对象是否在指定范围内,具体的使用方法如下:
1
2
|
[DateTimeRangeValidator("1990-01-01T00:00:00+08:00", RangeBoundaryType.Exclusive, "2010-01-01T00:00:00+08:00", RangeBoundaryType.Inclusive)]
public DateTime Birthday { get; set; }
|
这个验证器一共有12个构造函数,接收3类参数:
1)日期类型lowerBound、upperBound,字符串类型lowerBound、upperBound,这类参数是接收日期范围的上限和下限,日期类型的lowerBound、upperBound我就不多说了。
需要注意的是字符串类型lowerBound、upperBound,字符串类型的上限下限日期格式必须要符合ISO8601格式,就如我给出的代码一样,具体有关ISO8601知识可以看百度百科:ISO8601,里面有很详细的介绍。
2)枚举RangeBoundaryType,表示日期上限下限的范围,共有3个值:Ignore(忽略边界)、Inclusive(可以等于边界,下限<=值<=上限),Exclusive(不可以等于边界,就是小于边界,下限<值<上限)
3)命名参数
3、DomainValidator——通过检查验证对象,判断它是否属于一个集合
这个验证器主要是验证对象是否在一个指定的集合里,具体的使用方法如下:
1
2
|
[DomainValidator("a1", "a2", "a3")]
public string DomainItem { get; set; }
|
这个验证器只有4个构造函数,接收2类参数:
1)param参数集合domain,指定验证的集合
2)命名参数
4、EnumConversionValidator——检查字符串是否可以转换成枚举中的某一项
这个验证器主要是验证字符串对象是否可以转换成指定的枚举中某一项的值,其具体使用方法如下:
1
2
3
4
5
6
7
|
public enum ValidationEnum
{
A = 1,
B = 2
}
[EnumConversionValidator(typeof(ValidationEnum))]
public string EnumItem { get; set; }
|
这个验证很简单,只有2个构造函数,接收2类参数:
1)枚举的类型enumType,指定要验证的枚举类型
2)命名参数
5、HasSelfValidation——自我验证,只能用于类,为SelfValidationAttribute服务
这个验证器比较特殊,它无法通过企业库的配置工具进行配置,它仅仅是为要进行自验证的类添加一个表示,其本身没有什么业务逻辑,同时它也只能作用于类上,其具体用法如下:
1
2
|
[HasSelfValidation]
public class TestValidation
|
由于其本身没有业务逻辑,所以不需要接收任何参数。
6、IgnoreNulls——可为空验证
这个验证器很简单,就是表示待验证对象可以为空,具体用法如下:
1
2
|
[IgnoreNulls()]
public string Name2 { get; set; }
|
这个验证只接收一个参数就是命名参数。
7、NotNullValidator——不为空验证
这个验证器与上面的IgnoreNulls正好相反,表示待验证对象不可以为空,具体用法同上。
8、ObjectCollectionValidator——对象集合类型验证
这个验证器主要验证待验证的对象是否是集合类型,如果指定了目标类型,则会判断待验证的集合中的每一项是否为指定的目标类型,具体使用方法如下:
1
2
|
[ObjectCollectionValidator(typeof(string))]
public List<string> NameList { get; set; }
|
这个验证器有6个构造函数,接收2种类型的参数
1)指定目标类型targetType,用以验证待验证的集合中的每一项是否为指定的目标类型。
2)命名参数
9、ObjectValidator——对象类型验证
这个验证器比较有用,在实际开发中,我们总会将一个对象作为一个属性放在类中,这样可以很方便的获取到那个对象的信息,但是在验证时,因为这个属性是指一个对象,所以Validation模块无法对其进行验证,这时我们就要为这个属性加上一个ObjectValidator特性,来标示其可以验证,具体使用方法如下:
1
2
|
[ObjectValidator("student")]
public Student Student { get; set; }
|
这个验证器一共有4个构造函数,接收2类参数
1)字符串targetRuleset,表示待验证的对象所使用的验证集。
2)命名参数
10、PropertyComparisonValidator——属性比较验证
这个验证器也是比较常用的,主要用于属性比较验证,具体使用方法如下:
1
2
3
|
[PropertyComparisonValidator("ComparePropB", ComparisonOperator.Equal)]
public string ComparePropA { get; set; }
public string ComparePropB { get; set; }
|
这段代码的意思是,验证属性ComparePropA是否等于ComparePropB。
这个验证器的构造函数有2个,接收3类参数:
1)字符串propertyToCompare,表示要比较的属性名
2)枚举ComparisonOperator,比较类型枚举,具体有:Equal(等于)、NotEqual(不等于)、GreaterThan(大于)、GreaterThanEqual(大于等于)、LessThan(小于)、LessThanEqual(小于等于)
3)命名参数
11、RangeValidator——范围验证,判断对象是否在一个指定范围内
这个验证器和上面的DateTimeRangeValidator、StringLengthValidator等一样都是范围验证,只不过DateTimeRangeValidator只能验证日期,而RangeValidator可以验证任意类型(同时这个类型必须实现IComparable接口,有关IComparable接口信息请查看:MSDN),其最终会通过RangeValidator<T>进行验证,RangeValidator可以说是一个高级、功能强大的范围验证,只要能实现IComparable接口都可以进行范围验证,如int、double、string、DateTime等,具体用法如下:
1
2
|
[RangeValidator(0, RangeBoundaryType.Exclusive, 100, RangeBoundaryType.Exclusive)]
public int RangeItem { get; set; }
|
这个验证器共有14个构造函数,接收4类参数:
1)lowerBound、upperBound,上限下限范围,可以为int、long、double、float、string和datetime类型,在构造函数接收到这些类型参数时会强制转换成IComparable类型。
2)枚举RangeBoundaryType,表示日期上限下限的范围,共有3个值:Ignore(忽略边界)、Inclusive(可以等于边界,下限<=值<=上限),Exclusive(不可以等于边界,就是小于边界,下限<值<上限)
3)类型boundType,指定范围验证的对象类型
4)命名参数
注:这14个构造函数最终都会将传入的上下限转换成IComparable,然后调用一下构造函数:
12 private RangeValidatorAttribute(IComparable lowerBound, RangeBoundaryType lowerBoundType,IComparable upperBound, RangeBoundaryType upperBoundType)
12、RegexValidator——正则表达式验证
这个验证器就比较常见了,许多需要进行特殊验证的字符串都可以使用这个来完成,例如Email、邮编、URL等等,具体使用如下:
1
2
|
[RegexValidator("^[\\w-]+@[\\w-]+\\.(com|net|org|edu|mil|tv|biz|info|gov)$")]
public string Email { get; set; }
|
这个验证器一共有8个构造函数,接收5类参数:
1)字符串pattern,正则表达式
2)枚举System.Text.RegularExpressions.RegexOptions,正则表达式选项,具体请看MSDN
3)字符串patternResourceName,正则表达式所在的资源文件名,使用方法同验证错误消息模板
4)类型patternResourceType,正则表达式所在的资源类型,使用方法同验证错误消息模板
5)命名参数
13、RelativeDateTimeValidator——检查日期是否属于一个范围相对于当前时间或日期
这个验证器和DateTimeRangeValidator类似,只不过这个验证器是相对于当前时间进行范围验证,具体使用如下:
1
2
3
|
[RelativeDateTimeValidator(-100, DateTimeUnit.Year, -20, DateTimeUnit.Year,
MessageTemplate="请选择正确的出生日期!")]
public DateTime Birthday { get; set; }
|
这个验证器共有8个构造函数,接收4类参数:
1)int类型lowerBound、upperBound,上限下限范围,这个上下限范围必须是整数型,和第2类参数-枚举DateTimeUnit连用,表示在秒、分、时等时间上加上指定的上下限范围。
2)枚举DateTimeUnit,时间类型,有秒、分、时、天、月、年
3)枚举RangeBoundaryType,表示日期上限下限的范围,共有3个值:Ignore(忽略边界)、Inclusive(可以等于边界,下限<=值<=上限),Exclusive(不可以等于边界,就是小于边界,下限<值<上限)
4)命名参数
注:其中关键的相对于当前时间进行上下限范围获取主要是下面这段代码:
12345678910111213141516 public DateTime GenerateBoundDateTime(int bound, DateTimeUnit unit, DateTime referenceDateTime){DateTime result;switch (unit){case DateTimeUnit.Day: result = referenceDateTime.AddDays(bound); break;case DateTimeUnit.Hour: result = referenceDateTime.AddHours(bound); break;case DateTimeUnit.Minute: result = referenceDateTime.AddMinutes(bound); break;case DateTimeUnit.Month: result = referenceDateTime.AddMonths(bound); break;case DateTimeUnit.Second: result = referenceDateTime.AddSeconds(bound); break;case DateTimeUnit.Year: result = referenceDateTime.AddYears(bound); break;default: result = referenceDateTime; break;}return result;}bound:上下限值
unit:具体的时间类型
referenceDateTime:依赖的时间,在此时间上增加上下限值
14、SelfValidation——对调用一个方法进行自验证
这个验证器需要与上面的HasSelfValidation连用,实现方法的自验证,具体使用如下:
1
2
3
4
5
6
|
[SelfValidation(Ruleset = "self")]
public void DoValidate(ValidationResults validationResults)
{
validationResults.AddResult(
new ValidationResult("自验证消息", this, "self", "success", null));
}
|
这个验证器只有一个构造函数,接收1类参数:
1)命名参数
15、StringLengthValidator——字符串长度验证
这个验证器我觉得使用率应该是最高的了,因为在项目中经常会判断字符串是否输入,长度限制等,具体使用方法如下:
1
2
|
[StringLengthValidator(1, 16)]
public string Name3 { get; set; }
|
这个验证器共有6个构造函数,接收3类参数:
1)int类型lowerBound、upperBound,字符串上限下限范围
2)枚举RangeBoundaryType,表示日期上限下限的范围,共有3个值:Ignore(忽略边界)、Inclusive(可以等于边界,下限<=值<=上限),Exclusive(不可以等于边界,就是小于边界,下限<值<上限)
3)命名参数
16、TypeConversionValidator——类型转换验证,判断是否可以转换成指定类型
这个验证器主要用于检测某类型是否能转换成指定类型,具体使用如下:
1
2
|
[TypeConversionValidator(typeof(int))]
public string Age { get; set; }
|
这个验证器比较简单,就2个构造函数,接收2类参数
1)类型targetType,指定转换类型
2)命名参数
17、ValidatorCompositionAttribute——验证器组合
这个特性是在代码开发时候用来组合不同验证器的,具体使用如下:
1 2 3 4 |
[IgnoreNulls(MessageTemplate = "描述可为空,如不为空,则必须包含‘kyo’字符串!")] [ValidatorComposition(CompositionType.Or)] [ContainsCharactersValidator("kyo")] public string Name2 { get; set; } |
这个验证器只有一个构造函数,接收1个参数:2
1)枚举CompositionType,标识多个验证器之间的关系,分为:And(与关系,2个验证必须都满足),Or(或关系,标识只需满足其中一个)
到此我就介绍了前文中的第一类验证器,“可作为特性的验证器”,在本文中我就仅仅使用了特性代码的方式进行介绍,当然你也可以通过企业库的配置工具进行配置,其属性也是相同的。
在下一篇文章我将会介绍独立验证器和自定义验证。
PS:由于在上篇文章有朋友反映文章排版有点乱,所以这篇文章的排版进行了改变,如果大家有好的排版意见欢迎分享,在此谢谢了!
源代码下载地址:点我下载(本文源码在Model\TestValidation.cs下)