标签:
2: {
4: [HttpPost]
6: {
8: {
10: }
12: {
14: }
16: }
除了将验证规则通过ValidationAttribute特性直接定义在数据类型上并让ASP.NET MVC在进行参数绑定过程中据此来验证参数之外,我们还可以将验证操作直接定义在数据类型中。既然我们将验证操作直接实现在了数据类型上,意味着对应的数据对象具有“自我验证”的能力,我们姑且将这些数据类型称为“自我验证类型”。这些自我验证类型是实现了具有如下定义的接口IValidatableObject,该接口定义在“System.ComponentModel.DataAnnotations”命名空间下。
2: {
4: }
如上面的代码片断所示,IValidatableObject接口具有唯一的方法Validate,针对自身的验证就实现在该方法中。对于上面演示实例中定义的数据类型Person,我们可以按照如下的形式将它定义成自我验证类型。
2: {
4: public string Name { get; set; }
6: [DisplayName("性别")]
8:
10: public int? Age { get; set; }
12: public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
14: Person person = validationContext.ObjectInstance as Person;
16: {
18: }
20: {
22: }
24: if (string.IsNullOrEmpty(person.Gender))
26: yield return new ValidationResult("‘Gender‘是必需字段", new string[] { "Gender" });
28: else if (!new string[]{"M","F"}.Any(g=>string.Compare(person.Gender,g, true) == 0))
30: yield return new ValidationResult("有效‘Gender‘必须是‘M‘,‘F‘之一", new string[] { "Gender" });
32:
34: {
36: }
38: {
40: }
42: }
如上面的代码片断所示,我们让Person类型实现了IValidatableObject接口。在实现的Validate方法中,我们从验证上下文中获取被验证的Person对象,并对其属性成员进行逐个验证。如果数据成员没有通过验证,我们通过一个ValidationResult对象封装错误消息和数据成员名称(属性名),该方法最终返回的是一个元素类型为ValidationResult的集合。在不对其他代码作任何改动的情况下,我们直接运行该程序并在输入不合法数据的情况下提交表单后依然会得到如图1所示的输出结果。
上面我们让数据类型实现IValidatableObject接口并将具体的验证逻辑定义在实现的Validate方法中,这样的类型能够被ASP.NET MVC所识别,后者会自动调用该方法对绑定的数据对象实施验证。如果我们让数据类型实现IDataErrorInfo接口也能实现类似的自动化验证效果。
IDataErrorInfo接口定义在“System.ComponentModel”命名空间下,它提供了一种标准的错误信息定制方式。如下面的代码片段所示,IDataErrorInfo具有两个成员,只读属性Error用于获取基于自身的错误消息,而只读索引用于返回指定数据成员的错误消息。
2: {
4: string this[string columnName] { get; }
2: {
4: public string Name { get; set; }
6: [DisplayName("性别")]
8:
10: public int? Age { get; set; }
12: [ScaffoldColumn(false)]
private set; }
14:
16: {
18: {
20: {
22: {
24: {
26: }
28: }
30: {
32: {
34: }
string.Compare(this.Gender, g, true) == 0))
36: {
38: }
40: }
42: {
44: {
46: }
this.Age < 18)
48: {
50: }
52: }
54:
56: }
58: }
标签:
原文地址:http://www.cnblogs.com/zhyp/p/5472715.html