ASP.NETMVC Model验证(三)

简介:

ASP.NETMVC Model验证()

前言

上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的Model验证是在哪个具体的方法中来执行的,本篇的主题就是模拟一下默认的实现,自定义个Model绑定器继承自DefaultModelBinder类型,并且重写某些个重要的方法。

 

Model验证

  • Model验证简单运用示例

  • ModelValidator使用生成过程

  • 自定义实现DefaultModelBinder进行验证

  • 自定义ModelValidatorProvider ModelValidator 

  • ValidationAttribute特性类使用

  • 自定义ValidationAttribute特性类的示例实现

 

自定义实现DefaultModelBinder进行验证

以下用到的示例正是修改自ASP.NET MVC Model验证()篇幅中的示例,这里就不多说什么了,开始直接贴代码。

首先是ViewModel的定义,代码1-1

代码1-1

1
2
3
4
5
6
7
8
9
10
11
namespace  MvcApplication.Models
{
     public  class  RegistrationInformation
     {
         public  string  ID {  get set ; }
         public  string  UserID {  get set ; }
         public  string  Password1 {  get ; set ; }
         public  string  Password2 {  get ; set ; }
         public  string  Name {  get set ; }
     }
}


控制器的定义,代码1-2

代码1-2

1
2
3
4
5
6
7
8
9
10
11
     public  class  ModelValidatorController: Controller
     {
         public  ActionResult Index()
         {
             returnView( new  Models.RegistrationInformation());
         }
         public  ActionResult ModelValidator(RegistrationInformation regInfo)
         {
             returnView(regInfo);
         }
     }


控制器方法对应视图定义,代码1-3

代码1-3-1

Index视图

@model MvcApplication.Models.RegistrationInformation

@{

    ViewBag.Title = "Index";

}

<h2>Index</h2>

@using (Html.BeginForm("ModelValidator","ModelValidator"))

{

    <p>用户注册ID@Html.EditorFor(m=>m.ID)</p>

    <p>用户名:@Html.EditorFor(m=>m.UserID)</p>

    <p>登录密码:@Html.EditorFor(m=>m.Password1)</p>

    <p>再次输入域密码:@Html.EditorFor(m=>m.Password2)</p>

    <p>姓名:@Html.EditorFor(m=>m.Name)</p>

    <input type="submit" value="提交" />

}

代码1-3-2

ModelValidator视图

@model MvcApplication.Models.RegistrationInformation

@{

    ViewBag.Title = "ModelValidator";

}

<h2>ModelValidator</h2>

@Html.ValidationSummary(true)

<p>用户注册ID@Html.EditorFor(m => m.ID)

@Html.ValidationMessageFor(m=>m.ID)

</p>

<p>用户名:@Html.EditorFor(m => m.UserID)

@Html.ValidationMessageFor(m=>m.UserID)</p>

<p>登录密码:@Html.EditorFor(m => m.Password1)

@Html.ValidationMessageFor(m=>m.Password1)

</p>

<p>再次输入域密码:@Html.EditorFor(m => m.Password2)

@Html.ValidationMessageFor(m=>m.Password2)

</p>

<p>姓名:@Html.EditorFor(m=>m.Name)</p>

前面所示的就是把示例演示所需的定义好,这个时候运行会发现,只不过是一个页面传值而已,什么都没有发生。现在我们来定义一下自定义的Model绑定器继承自DefaultModelBinder类型。

代码1-4

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
     public  class  MyCustomDefaultModelBinder: DefaultModelBinder
     {
         protectedoverride voidSetProperty(ControllerContextcontrollerContext, ModelBindingContextbindingContext, PropertyDescriptorpropertyDescriptor,  object  value)
         {
             base .SetProperty(controllerContext,bindingContext, propertyDescriptor, value);
  
             switch (propertyDescriptor.Name)
             {
                 case "ID" :
                     if ( string .IsNullOrEmpty(( string )value)|| ( string )value ==  "" )
                     {
                        bindingContext.ModelState.AddModelError( "ID" , "请输入ID,ID不能为空!" );
                     }
                     break ;
                 case "UserID" :
                     if ( string .IsNullOrEmpty(( string )value)|| ( string )value ==  "" )
                     {
                        bindingContext.ModelState.AddModelError( "UserID" , "请输入用户账户,用户账户不能为空!" );
                     }
                     break ;
                 case "Password1" :
                     if ( string .IsNullOrEmpty(( string )value)|| ( string )value ==  "" )
                     {
                        bindingContext.ModelState.AddModelError( "Password1" , "请输入登录密码,登录密码不能为空!" );
                     }
                     break ;
                 case "Password2" :
                     if ( string .IsNullOrEmpty(( string )value)|| ( string )value ==  "" )
                     {
                         bindingContext.ModelState.AddModelError( "Pssword2" "请再次输入密码,密码不能为空!" );
                     }
                     break ;
                 case "Name" :
                     break ;
             }
         }
  
         protectedoverride voidOnModelUpdated(ControllerContextcontrollerContext, ModelBindingContextbindingContext)
         {
             base .OnModelUpdated(controllerContext,bindingContext);
             Models.RegistrationInformationregInfo = bindingContext.Model  as  Models.RegistrationInformation;
             if (bindingContext.ModelState[ "Password1" ].Errors.Count== 0 && bindingContext.ModelState[ "Password2" ].Errors.Count== 0)
             {
                 if (regInfo.Password1 != regInfo.Password2)
                 {
                    bindingContext.ModelState.AddModelError( "Password2" , "请重新输入密码,与上次输入密码不同" );
                 }
             }
             if ( string .Compare(regInfo.Name,  "jinyuan" true )==0)
             {
                bindingContext.ModelState.AddModelError( "" , "您输入的名称违法了,立即更改不然查水表" );
             }
         }
     }


代码1-4中,我们重写了SetProperty()方法,从上篇的知识中得知,这个方法是在PropertyDescriptor类型的集合中遍历执行的,所以每次进入方法内部的只是个Model属性,而在SetProperty()方法内部的Model验证判断逻辑和ASP.NETMVC Model验证()篇幅的一样。

而在OnModelUpdated()方法中,我们首先获取了示例代码1-1中定义的ViewModel类型实例,这里有的朋友可能会问为什么不在SetProperty()方法中也这样使用,而是使用PropertyDescriptor类型的参数来进行验证操作,因为在SetProperty()方法执行的期间并没有对ViewModel完全的赋值,所以不能那样直接获取实例来使用。接着上面的说,在此之后从当前的绑定上下文的ModelState属性中获取判断密码1和密码2是否存在属性验证级的错误信息,没有的话将会对它们进行等值验证,正如上面代码所示的那样,随之验证Name的时候我将错误信息添加的键值为””,这表示默认为Model级验证错误信息。

所需要做的验证都做完了,注册我们的自定义绑定器到系统中,在Global.asax文件的Application_Start()中添加代码1-5.

代码1-5

1
ModelBinders.Binders.Add( typeof (Models.RegistrationInformation), new  Binders.MyCustomDefaultModelBinder());


 

最后我们看一下效果图,图1表示为起初展示的页面,在我输入一部分的信息过后,点击提交过后页面会跳转到图2,并且执行完验证显示出验证后的错误信息。

1

wKiom1O-krOSb5L2AAEL1TlPDiQ637.jpg


2

wKioL1O-krLgdMM1AAHGT3AcGlE253.jpg


大家可以动手试一试,到这里说明了一种验证方式,将在下篇为大家讲解MVC框架提供给我们的正儿八经用来执行验证的类型的一些相关类型,以及一些简单的示例,这样我们就不在使用Model绑定器来执行验证了,看起来绑定器有点不务正业。





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




相关文章
|
2月前
|
开发框架 JSON .NET
|
4月前
|
开发框架 JavaScript .NET
Asp.Net就业课之三验证控件
Asp.Net就业课之三验证控件
64 0
|
开发框架 JSON 算法
ASP.NET Core Web API之Token验证
ASP.NET Core Web API之Token验证
236 0
|
开发框架 .NET 数据安全/隐私保护
ASP.NET验证控件合集 含代码演示
ASP.NET验证控件合集 含代码演示
|
存储 开发框架 前端开发
ASP.NET 中验证的自定义返回和统一社会信用代码的内置验证实现
本文介绍 ASP.NET 中内置的验证功能,并介绍如何自定义验证返回信息,最后以统一社会信用代码为例,实现自定义的数据验证。
221 0
ASP.NET 中验证的自定义返回和统一社会信用代码的内置验证实现
|
开发框架 JSON 前端开发
ASP.NET MVC5----常见的数据注解和验证
ASP.NET MVC5----常见的数据注解和验证
333 0
ASP.NET MVC5----常见的数据注解和验证
|
开发框架 .NET
asp.net生成验证码并提交验证
asp.net生成验证码并提交验证
212 0
|
XML 开发框架 JSON
ASP.NET Core - 实现自定义WebApi模型验证
ASP.NET Core - 实现自定义WebApi模型验证  Framework时代    在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 复制代码 [HttpPost] public async Task<JsonResult> SaveNewCus...
1705 0
|
开发框架 前端开发 JavaScript
ASP.NET Core MVC 之模型(Model)
ASP.NET Core MVC 之模型(Model)  1.模型绑定   ASP.NET Core MVC 中的模型绑定将数据从HTTP请求映射到操作方法参数。参数既可以是简单类型,也可以是复杂类型。
1168 0