本文共 4360 字,大约阅读时间需要 14 分钟。
ASP.NETMVC Model验证(五)
前言
上篇主要讲解ModelValidatorProvider和ModelValidator两种类型的自定义实现,然而在MVC框架中还给我们提供了其它方式来进行Model验证,也就是本篇的主题,使用框架提供给我们的一系列的特性类型来进行Model验证,当然也是可以自定义的,在下面的演示示例中,我会使用我们自己自定义的特性类型(继承自ValidationAttribute类型)到自定义Model绑定器中来模拟一下实现。
Model验证
Model验证简单运用示例
ModelValidator使用生成过程
自定义实现DefaultModelBinder进行验证
自定义ModelValidatorProvider 和ModelValidator
ValidationAttribute特性类使用
自定义ValidationAttribute特性类的示例实现
ValidationAttribute特性类使用
我们首先看一下ValidationAttribute类型的定义,示例代码1-1。
代码1-1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public abstract class ValidationAttribute: Attribute { protectedValidationAttribute(); protectedValidationAttribute(Func< string > errorMessageAccessor); protectedValidationAttribute( string errorMessage); // 摘要: // 获取或设置一条在验证失败的情况下与验证控件关联的错误消息。 // // 返回结果: // 与验证控件关联的错误消息。 public string ErrorMessage { get ; set ; } public string ErrorMessageResourceName { get ; set ; } public Type ErrorMessageResourceType { get ; set ; } protectedstring ErrorMessageString { get ; } public virtual stringFormatErrorMessage( string name); public ValidationResult GetValidationResult( object value, ValidationContextvalidationContext); // // 摘要: // 确定对象的指定值是否有效。 // // 参数: // value: // 要验证的对象的值。 // // 返回结果: // 如果指定的值有效,则为 true;否则,为 false。 public virtual bool IsValid( object value); protectedvirtual ValidationResultIsValid( object value, ValidationContextvalidationContext); public void Validate(objectvalue, string name); public void Validate(objectvalue, ValidationContext validationContext); } |
ValidationAttribute类型就是下面示例中所有应用在Model属性上特性类型的基类,在上面的ValidationAttribute类型中ErrorMessage属性表示验证错误所显示信息,IsValid()方法则是表示验证的值是否通过,下面我们看一下框架给我们提供的Model验证特性类的简单示例。
首先我们还是使用ASP.NETMVC Model验证(一)中的示例代码,看一下ViewModel使用了验证特性类后的定义,示例代码1-2.
代码1-2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | namespace MvcApplication.Models { ///<summary> /// ViewModel-用户注册信息 ///</summary> public class RegistrationInformation { [Required] public string ID { get ; set ; } [Required] public string UserID { get ; set ; } [Required] [StringLength(10)] public string Password1 { get ; set ; } [Compare( "Password1" )] public string Password2 { get ; set ; } public string Name { get ; set ; } } } |
在代码1-2中,我们看到了一些应用于Model属性上的特性类,下面简单的说一下这几种类型的含义。
Required:[Required],表示此属性不得为空(包括空字符串),当然了也可以通过设置内部的AllowEmptyStrings属性为true后,则视为可以为空。
StringLength:[StringLength(10)],表示此属性值的字符串最大长度不能超过10。
Compare:[Compare(“Password1”)],表示此属性的值必须和指定属性的值相同,示例中就是Password2的值必须和Password1属性的值相同,不然就会提示验证的错误信息
下面来一下项目运行后的结果图,
图1
图1中故意输入的这些数值,看下图2是验证后的结果
图2
自定义ValidationAttribute特性类的示例实现
这一小节我们直接来看自定义Model验证特性类型,直接来看定义的示例代码1-3.
代码1-3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | namespace MvcApplication.ModelValidators { [AttributeUsage(AttributeTargets.Property,AllowMultiple= true ,Inherited= false )] public class CustomModelValidatorAttribute:ValidationAttribute { public override boolIsValid( object value) { if ( string .IsNullOrEmpty(( string )value)|| string .Compare(( string )value, "jinyuan" , true ) == 0) { ErrorMessage = "不能为空,或名称不合法!" ; returnfalse; } else { returntrue; } } } } |
这里为什么要重写基类的IsValid()方法,可能MVC框架会调用这个方法来判断当前值是否通过验证,这里说一句题外话,在MVC框架中我翻看过默认绑定器类型的实现代码,并没有找到对Model验证特性类的调用,哪位大神知道的话告知一下小弟感激不尽。
现在我们再修改一下代码1-2中的定义,示例代码1-4.
代码1-4
1 2 | [CustomModelValidator] public string Name { get ; set ; } |
修改过后我们看一下结果图3和图4.
图3
图4
看到这里,有点不死心,想模拟实现一下默认绑定器的内部实现,这部分内容仅供参考,示例代码1-5.
代码1-5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class CustomModelValidatorAttributeModelBinder: DefaultModelBinder { protectedoverride voidSetProperty(ControllerContextcontrollerContext, ModelBindingContextbindingContext, PropertyDescriptorpropertyDescriptor, object value) { base .SetProperty(controllerContext,bindingContext, propertyDescriptor, value); foreach (Attribute att inpropertyDescriptor.Attributes) { if (att is ModelValidators.CustomModelValidatorAttribute) { ModelValidators.CustomModelValidatorAttribute mva = att as ModelValidators.CustomModelValidatorAttribute; if (!mva.IsValid(value)) { bindingContext.ModelState.AddModelError(propertyDescriptor.Name,mva.ErrorMessage); } } } } } |
在代码1-5中我们根据PropertyDescriptor类型的参数获取到应用在Model属性上的所有特性类,然后筛选到我们自定义的类型,进行一个验证判断然后将其错误信息添加到ModelState中,需要把我们自定义的这个Model绑定器注册到系统中,运行的时候按照图3的输入,结果就跟图4一样。同样的都能实现功能,这里只是让大家对默认的绑定器营造个遐想的空间。