ASP.NETMVC Model验证(五)

简介:

ASP.NETMVC Model验证()

前言

上篇主要讲解ModelValidatorProviderModelValidator两种类型的自定义实现,然而在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

wKiom1PFI12Dr2s7AAEacGWHlNQ222.jpg


1中故意输入的这些数值,看下图2是验证后的结果

2

wKiom1PFI2_S43u3AAGvskUfCH4947.jpg



自定义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

wKioL1PFI5HjrxZsAAEfNAVuxvU698.jpg

4

wKiom1PFI9PzsuJsAAHLo-yrRZ0597.jpg


看到这里,有点不死心,想模拟实现一下默认绑定器的内部实现,这部分内容仅供参考,示例代码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一样。同样的都能实现功能,这里只是让大家对默认的绑定器营造个遐想的空间。






     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1438617 ,如需转载请自行联系原作者


相关文章
|
前端开发 .NET 数据安全/隐私保护
菜鸟入门【ASP.NET Core】15:MVC开发:ReturnUrl实现、Model后端验证 、Model前端验证
ReturnUrl实现 我们要实现returnUrl,我们需要在注册(Register)方法中接收传进的returnUrl并给它默认值null,然后将它保存在ViewData里面 然后我们定义一个内部方法来判断跳转returnUrl //内部跳转 private IActionR...
2444 0
|
9月前
|
开发框架 JSON 算法
ASP.NET Core Web API之Token验证
ASP.NET Core Web API之Token验证
145 0
|
XML 开发框架 JSON
ASP.NET Core - 实现自定义WebApi模型验证
ASP.NET Core - 实现自定义WebApi模型验证  Framework时代    在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 复制代码 [HttpPost] public async Task<JsonResult> SaveNewCus...
1662 0
|
开发框架 前端开发 JavaScript
ASP.NET Core MVC 之模型(Model)
ASP.NET Core MVC 之模型(Model)  1.模型绑定   ASP.NET Core MVC 中的模型绑定将数据从HTTP请求映射到操作方法参数。参数既可以是简单类型,也可以是复杂类型。
1136 0
ASP.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一、案例结构总览   这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要通过API网关(这里API网关始终作为客户端的统一入口)先向IdentityService进行Login以进行验证并获取Token,在IdentityService的验证过程中会访问数据库以验证。
2705 0
|
前端开发
4.ASP.NET全栈开发之在MVC中使用服务端验证(二)
首先声明,这篇博文是完善.ASP.NET全栈开发之在MVC中使用服务端验证 的,所以重复内容,我就不过多的阐述,很多问题都是在实践中去发现,然后再去完善,这篇博文也一样,建立在已阅 “.ASP.NET全栈开发之在MVC中使用服务端验证” 的基础上。
1219 0
|
前端开发 UED .NET
2.ASP.NET全栈开发之在MVC中使用服务端验证
上一章我们在控制台中基本的了解了FluentValidation是如何简洁,优雅的完成了对实体的验证工作,今天我们将在实战项目中去应用它。 首先我们创建一个ASP.NET MVC项目,本人环境是VS2017, 创建成功后通过在Nuget中使用 Install-Package FluentValidation -Version 7.
1106 0
|
前端开发 JavaScript .NET
ASP.NET MVC5中的Model验证
Model验证是ASP.NET MVC中的重要部分,它主要用于判断输入的数据类型及值是否符合我们设定的规则,这篇文章就介绍下ASP.NET MVC中Model验证的几种方式。 后台验证 DataAnnotation ValidationAttribute IValidatableObje...
796 0
|
前端开发 .NET 开发框架
ASP.NET Web Forms 4.5的新特性(三):Model Binding
在前两篇文章中,我们了解到了ASP.NET Web Forms 4.5四个新特性:强类型数据控件和Bundling、针对HTML5的更新和Unobtrusive Validation。 在介绍强类型控件的时候只是简单介绍了下它具有ItemType的属性,可以设置强类型值进行绑定,如果只是引入了这个属性,那么有点像语法糖,没什么实际意义。
767 0