中] 目录 一、ValidationAttribute特性 二、验证消息的定义 三、验证的执行 四、预定义ValidationAttribute 五、应用ValidationAttribute特性的唯一性 一、ValidationAttribute特性 与通过数据标注特性定义Model元数据类似,我们可以在作为Model的数据类型及其属性上应用相应的标注特性来定义 四、预定义ValidationAttribute 在System.ComponentModel.DataAnnotations命名空间下定义了一系列继承自ValidationAttribute的验证特性 五、应用ValidationAttribute特性的唯一性 对于上面列出的这些预定义ValidationAttribute,它们都具有一个相同的特性,那就是在同一个目标元素中只能应用一次,这可以通过应用在它们之前的 Model验证系统在根据ValidationAttribute特性创建相应的DataAnnotationsModelValidator对象的时候会根据该TypeId属性值进行分组,同一组的ValidationAttribute
ASP.NET MVC采用System.ComponentModel.DataAnnotations提供的元数据验证机制对Model实施验证,我们可以在Model类型或者字段/属性上应用相应的ValidationAttribute 但是在默认情况下,对于同一个类型的ValidationAttribute特性只允许一个应用到目标元素上——即使我们将AllowMultiple属性设置为True。这篇文章的目的就是为了解决这个问题。 [源代码从这里下载] 一、一个自定义ValidationAttribute:RangeIfAttribute 为了演示在相同的目标元素(类、属性或者字段)应用多个同类的ValidationAttribute ASP.NET MVC在生成包括验证特性的Model的元数据的时候,针对某个元素的所有ValidationAttribute是被维护在一个字典上的,而这个字典的值就是Attribute的TypeId属性 在默认的情况下,Attribute的TypeId返回的是自身的类型,所以导致应用到相同目标元素的同类ValidationAttribute只能有一个。
中] 目录 DataAnnotationsModelValidator 基于ValidationAttribute的ModelValidator的创建 基于IValidatableObject 的ModelValidator的创建 委托DataAnnotationsModelValidationFactory根据ModelMetadata、ControllerContext和ValidationAttribute 返回一个ModelValidator对象,而字段AttributeFactories表示的字典对象的Key是具体的验证特性的类型,也就是说它维护一个ValidationAttribute特性类型和对应ModelValidator 从如下的代码片断可看出,对于一般的ValidationAttribute,对应的ModelValidator是一个DataAnnotationsModelValidator对象(DefaultAttributeFactory ASP.NET MVC基于标注特性的Model验证:ValidationAttribute ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator
对于ASP.NET MVC基于标注特性的Model验证,很多人只知道应用在数据类型及其属性上用于定义验证规则和错误消息的ValidationAttribute。 ValidationAttribute对应的ModelValidator为DataAnnotationsModelValidator,这篇简短的文章为你介绍ASP.NET MVC是如何针对Validation 如下面的代码片断所示,被封装的ValidationAttribute通过只读属性Attribute表示,该属性在构造函数中被初始化。 由于只有RequiredAttribute才用于必需字段的验证,所有只有被封装ValidationAttribute为RequiredAttribute时其IsRequired属性返回True。 当我们将这些ValidationAttribute应用到Model类型时,真正用于Model验证的实际上就是这些作为适配的ModelValidator。
ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效。 如果我们能够将ValidationAttribute特性直接应用到参数上,我们不但可以实现简单类型(比如int、double等)数据的Model验证,还能够实现“一个Model类型,多种验证规则”,本篇文章将为你提供相关的解决方案 中] 目录 一、ValidationAttribute本身是可以应用到参数上的 二、为什么需要基于参数的Model验证? 三、如何得到应用在参数上的ValidationAttribute? 三、如何得到应用在参数上的ValidationAttribute?
服务端验证最终实现在相应的ModelValidator中,而最终的验证规则定义在相应的ValidationAttribute中;而客户端验证规则通过HtmlHelper<TModel>相应的扩展方法(比如 毫无疑问,服务端验证和客户端验证必须采用相同的验证规则,那么通过应用ValidationAttribute特性定义的验证规则也同样体现在基于客户端验证规则的HTML上。 中] 一、ValidationAttribute与HTML ASP.NET MVC默然采用基于ValidationAttribute特性的声明式Model验证,服务端验证最终实现在两个重写的IsValid 为了让客户端和服务端采用相同的验证规则,应用在Model类型某个属性上的ValidationAttribute特性最终会体现在目标属性对应的HTML元素上。 一般来说,一个ValidationAttribute对应着一种验证类型和一系列可选的验证参数。
目录 一、手工验证绑定的参数 二、使用ValidationAttribute特性 三、让数据类型实现IValidatableObject接口 四、 二、使用ValidationAttribute特性 将针对输入参数的验证逻辑和业务逻辑定义在Action方法中并不是一种值得推荐的编程方式。 当我们在定义数据类型的时候,可以在类型及其数据成员上面应用相应的ValidationAttribute特性来定义默认采用的验证规则。 常规验证可以通过上面列出的这些预定义ValidationAttribute特性来完成,但是在很多情况下我们需要通过创建自定义的ValidationAttribute特性来解决一些特殊的验证。 如下所示的是属性成员上应用了相关ValidationAttribute特性的Person类型的定义。
虽然我们可以将它们存储于资源文件中,并且ASP.NET的ValidationAttribute也对这种方式提供了原生的支持。 在这篇文章中将会通过扩展现有的ValidationAttribute特性让ASP.NET MVC应用可以使用我们的消息组件来获取验证消息。 ); 13: } 14: public static MessageManager Current = new MessageManager(); 15: } 通过直接继承ValidationAttribute 1: public class ExtendedValidationAttribute : ValidationAttribute 2: { 3: public ExtendedValidationAttribute args)) 5: { 6: } 7: } 二、扩展的RequiredAttribute和RangeAttribute 接下来我们来演示如何定义具体的ValidationAttribute
可以看出,要编写一个自己的验证规则是非常简单的,只需要继承自ValidationAttribute类,并重载IsValid方法即可。 AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class CountryAttribute : ValidationAttribute AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class CustomeAttribute : ValidationAttribute
在《ASP.NET MVC下的四种验证编程方式》一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”、“标注ValidationAttribute特性”、“让数据类型实现IValidatableObject 对于上面提到的这三种验证编程方式,第一种(利用应用在数据类型或其数据成员上的ValidationAttribute特性来定义相应的验证规则)是最为常用的。 基于ValidationAttribute特性这种声明式验证解决方案最终通过DataAnnotationsModelValidator来完成。 一个DataAnnotationsModelValidator对象实际上是对一个ValidationAttribute特性的封装,这可以从如下所示的定义看出来。 ASP.NET MVC基于标注特性的Model验证:ValidationAttribute ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator
ValidationAttribute 充当所有验证特性的基类。 ValidationContext 描述执行验证检查的上下文。 Validator 定义一个帮助器类,在与对象、属性和方法关联的 ValidationAttribute 特性中包含此类时,可使用此类来验证这些项。 (Inherited from ValidationAttribute) ErrorMessageString 获取本地化的验证错误消息。 (Inherited from ValidationAttribute) TypeId 在派生类中实现时,获取此 Attribute 的唯一标识符。 (Inherited from ValidationAttribute) GetHashCode() 返回此实例的哈希代码。
自定义校验特性 自定义一个校验特性很简单,创建一个继承 ValidationAttribute 的类,然后重写它的 IsValid 方法。 AttributeTargets.Property, AllowMultiple = false, Inherited = false)] public class EvenNumberAttribute : ValidationAttribute
我们的验证特性都直接或者间接地继承自具有如下定义的ValidatorBaseAttribute,而它使ValidationAttribute的子类。 至于为什么需需要这么做,可以参考我的上一篇文章《在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?》。 与当前的语言文化一致,也返回False; 其余情况返回True 四、通过自定义ModelValidatorProvider在验证之前将不匹配Validator移除 应用在Model类型或其属性/字段上的ValidationAttribute , allAttributes); 15: } 16: } 如上面的代码片断所示,在重写的GetClientValidationRules方法中,输入参数attributes表示所有的ValidationAttribute ,在这里我们根据调用ValidatorBaseAttribute的Match方法将不匹配的Validator特性移除,然后根据余下的ValidationAttribute列表调用基类GetValidators
, MinimumLength = 6)] public string NewPassword { get; set; } 4扩展 自定义注解 创建自定义特性,继承自ValidationAttribute ,ValidationAttribute有两个虚方法,可以通过重载这两个虚方法来完成自定义验证逻辑。 object value, ValidationContext validationContext); 例: public class CustomValidationAttribute : ValidationAttribute
通过继承 ValidationAttribute 类,并重写 IsValid 方法来自定义 Attribute。 使用 // 继承 System.ComponmentModel.DataAnnotations 命名空间下的 ValidationAttribute类 public class EmployeeNoMustFromFirstNameAttribute : ValidationAttribute { // 重写 IsValid 方法 protected override ValidationResult IsValid
在这里我们替换的是一个DataAnnotationsModelValidator,而它基于的ValidationAttribute是我们自定义的NumericAttribute。 如下面的代码片断所示,内部类型NumericAttribute是ValidationAttribute的子类,并且实现了IClientValidatable接口。 1: internal class NumericAttribute : ValidationAttribute, IClientValidatable 2: { 3: public
敏感词检查的特性,一匹配就抛异常 /// [AttributeUsage(AttributeTargets.Property)] public class MinGanCheck : ValidationAttribute > /// 敏感词替换 /// [AttributeUsage(AttributeTargets.Property)] public class MinGanReplace : ValidationAttribute
18, 30)] 数字在18与30之间,可以不填写,但填写就进入验证 /// public class IntRangeExpressionAttribute : ValidationAttribute (50)]字符数在不能少于50个字符,可以不填写,但填写就进入验证 /// public class MinWordsExpressionAttribute : ValidationAttribute NotNullExpression] 验证是否为空且不能有空格 调用 /// public class NotNullExpressionAttribute : ValidationAttribute "abcd")],不能等于指定的值,可以不填写:如不能等于abcd /// public class NotEqualExpressionAttribute : ValidationAttribute 为可空字端 摘一段代码解释一下吧 比如这个[NotNullExpression] 方法 public class NotNullExpressionAttribute : ValidationAttribute
ModelValidatorProvider ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProviders ASP.NET MVC基于标注特性的Model验证:ValidationAttribute DataAnnotationsModelValidator ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute
AttributeTargets.Parameter, AllowMultiple = false)] public class AllowedValuesAttribute : ValidationAttribute (Overrides <see cref="<em>ValidationAttribute</em>.IsValid(object)" />) /// /// <param