ASP.NET MVC Model验证(二)

简介:

ASP.NET MVC Model验证()

前言

上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决 这个问题的,并且会描述一下ModelValidator类型对象相关的类型。

 

Model验证

  • Model验证简单运用示例

  • ModelValidator使用生成过程

  • 自定义实现DefaultModelBinder进行验证

  • 自定义ModelValidatorProvider 和ModelValidator 

  • ValidationAttribute特性类使用

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

 

ModelValidator使用生成过程

首先请允许我“盗”一张图,这个示意图是在我前面篇幅的ASP.NET MVC Model绑定(二)中的一张图。

图1

为什么要“盗”这个图1,因为Model验证的过程将是在这个图中的某个位置,对于这个示意图的意思我就不详细 说明了,只说明一下蓝色线条部分,那是Model绑定器生成部分,我们需要的也是这个部分。看下图2

图2

图2的部分也是图1中的,这样一步步的分解下来,让大家有个由大到小的由远到近的层次感,便于记忆和留下印象。这里有 的朋友会说了这是Model绑定部分拉过来有什么用?这个是有用的,看一下【IModelBinder.BindModel()】这个部分到【获取控 制器方法参数值】部分,也就是整个Model绑定的过程了,主题是Model验证又扯绑定了,没办法阿,因为在Model绑定之前会进 行Model验证。

在我们没有自定义Model绑定器的时候,系统默认实现的都是DefaultModelBinder类型,那么我就来看一 下DefaultModelBinder类型的内部的具体实现吧。。。

开个玩笑,是看一下内部实现不过不是源码而是示意图(图3),这样给大家留个印象,感兴趣的自己去扒源码看吧。

图3

感觉是不是有点坑,别急大家,坑谁不敢坑你们,实际上还有一条流程这里没有显示,这里显示就是绑定复杂类型的Model所 要执行的内部方法。而在BindComplexModel)(方法内部的实现里才会进行Model验证,我们看一下方法的内部执行示意图(图4) 。

图4

长话短说,执行Model验证的过程是先执行Model中的属性级验证,然后执行Model级验证。

在BindComplexElementalModel()方法中,首先会执行BindProperties()方法,在此方法内部会遍历PropertyDescriptor集合 类型(图4中显示PropertyDescriptorCollection是不足的地方),正如大家所看到的一样,SetProperty()方法才是最后真正对 Model属性进行验证的函数(下个篇幅会有讲解实现自定义的Model绑定器执行Model验证会讲到这个方法)。

而在SetProperty()方法中真正执行验证的,可以是自定义的,当然了系统默认的就是从 ModelValidatorProviders.Providers中获取的了,所有验证的后的错误信息(假使有)都存在了ModelBindingContext类型的参数中了,以此向下传递。

验证完Model属性后则会验证Model本身,就会调用OnModelUpdated()方法,这个方法有个毛病,就是自己不干 活,在它内部使用CompositeModelValidator类型的实例来进行验证,不过验证最后使用的还是 ModelValidatorProviders.Providers中我们自定义的ModelValidator类型或者是默认的(这里具体的细节本人也没有去细看, 大概的流程是这样如果有误差请指正,感激不尽)。

最后我们说一下ModelValidator类型的注册,首先系统是不认它的,它可能不是“亲 生”的。系统的ModelValidatorProviders类型中的Providers属性是ModelValidatorProviderCollection类型的,这下大 家应该看到系统认谁了吧,就是认识ModelValidator类型的“爹”ModelValidatorProvider类型 (毕竟不是继承关系),这里就不多说相关的模型了,跟前面好多的模型都相像。

对于自定义实现ModelValidator类型的示例演示在后续的篇幅中会有讲到。





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




相关文章
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
41 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
99 5
|
7月前
|
存储 前端开发 Java
Spring MVC 中的数据绑定和验证机制是什么,如何使用
Spring MVC 中的数据绑定和验证机制是什么,如何使用
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
124 0
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
116 0
|
9月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
67 0
|
5月前
|
开发框架 自然语言处理 前端开发
基于ASP.NET MVC开发的、开源的个人博客系统
基于ASP.NET MVC开发的、开源的个人博客系统
52 0