ASP.NET MVC Model绑定小结
Model绑定是指从URL提取数据,生成对应Action方法的参数这个过程。前面介绍的一系列Descriptor负责提供了控制器,行为方法和参数的元数据,ValueProvieder负责获取数据,剩下的Moder绑定则是利用上述两者的结果来最终达到Model的生成。ParameterDescriptor里面的BindingInfo(类型是ParameterBindingInfo)的Binder是一个实现了IModelBinder接口的对象,ModelBinder组件用于真正的Model绑定。
ModelBinder组件
下面则先看组件的类图
IModelBinder:BindModel方法,实现Model绑定功能的方法,传入ControllerContext和ModelBindingContext返回绑定完毕的Model。
CustomModelBinderAttribute:抽象特性,完成Model与ModelBinder之间的绑定处理,里面的GetBinder方法用于获取ModelBinder。
ModelBinderAttribute:CustomModelBinderAttribute的唯一继承,可用于参数,接口,枚举,结构,类的特性中,但是只有作为Action方法的参数特性时才会在ParameterDescriptor解析的时候解析出来。
IModelBinderProvider:MVC框架中没有一个类实现这个接口,主要用于进行自定义扩展。GetBinder方法用于按指定类型获取ModelBinder。
ModelBinderProviderCollection:对于IModelBinderProvider的一个集合。
ModelBinderProviders:拥有只读属性BinderProviders,是ModelBinderProviderCollection类型。
ModelBinderDictionray:IModelBinder的字典集合,以Model的数据类型Type为Key,对应的ModelBinder为Value的字典集。
ModelBinders:具有Binders的只读属性,类型是ModelBinderDictionray,只用于获取ModelBinderDictionray。
获取ModelBinders的机制:它一般是先从ParameterDescription里面检查ModelBinder是否存在,如果该ModelBinder不存在,就使用ModelBinders.Binders属性中获取,实际上是从ModelBinderDictionary的内部集合_innerDictionary或_modelBinderProviders中获取;如果在上述两个集合中也无法获取,则使用ModelBinderDictionary中的默认MolderBinder——_defaultBinder。
按照上述的获取机制,在定制数据类型的ModelBinder时,使用不同的方式,ModelBinder获取时也会有不同的优先级:
1)为Action方法上的参数加上ModelBinderAttribute或CustomModelBinderAttribute特性;
2)自定义ModelBinderProvider未某种Model数据提供ModelBinder,使用ModelBinderProviders.BinderProviders.Add方法添加到集合中去
3)为Model类型加上ModelBinderAttribute或CustomModelBinderAttribute特性
4)通过ModelBinders的Binders属性添加ModelBinder。
ModelState
Model绑定除了把值绑定到Action方法的参数上,同样也会绑定到Controller的ViewData中,下图则是列举了ModelState相关的类。
ModelBindingContext
ModelBindingContext:具有一系列来自于ParameterDescriptor的属性。ModelBinderContext的生成以及发挥作用如下图所示
ASP.NET MVC Model绑定小结的更多相关文章
- ASP.NET MVC Model绑定(六)
ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框 ...
- ASP.NET MVC Model绑定(五)
ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...
- ASP.NET MVC Model绑定(四)
ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...
- ASP.NET MVC Model绑定(三)
ASP.NET MVC Model绑定(三) 前言 看过前两篇的朋友想必对Model绑定有个大概的了解,然而MVC框架给我们提供了更高的可扩展性的提供程序编程模式,也就是本篇的主题了,会讲解一下Mod ...
- ASP.NET MVC Model绑定(二)
ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...
- ASP.NET MVC Model绑定(一)
ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...
- ASP.NET MVC Model绑定
ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...
- ModelBinder——ASP.NET MVC Model绑定的核心
ModelBinder——ASP.NET MVC Model绑定的核心 Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过 ...
- ASP.NET MVC Model绑定的简单应用
Model绑定是 MVC 框架根据 HTTP 请求数据创建 .NET 对象的一个过程. 一.简单类型 1.单一值
随机推荐
- Linux 对比两个文本的交集和差集(comm)
200 ? "200px" : this.width)!important;} --> 介绍 comm命令可以对两个已排序好的文本的内容进行交集和差集的对比,记住必须是已排序 ...
- 推荐windows下的日志跟踪工具:SnakeTail
用过Linux的同学都知道,在Linux中要实时跟踪日志文件那是非常的方便,Tail.Less都可以做到. 开启动态跟踪后,程序会监视文件修改,从而不断刷新出最新的内容,对于线上运维特别有用. 今 ...
- [ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)
上一节讲了16位定时器1,本节讲8位定时器3和定时器4! 1.综述 Timer 3 and Timer 4 are two 8-bit timers(8位定时器). Each timer has tw ...
- Linux网络编程系列-套接口选项控制
获取和设置套接口选项的方法有: getsockopt/setsockopt fcntl ioctl getsockopt/setsockopt 这两个函数仅用于套接口(socket)的设置,另外两个函 ...
- 开发者最常用的 8 款 Sublime Text 3 插件
转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/177.html?1456925631Sublime Text作为一个尽为人知的代码编辑器, ...
- Java-继承,多态练习0922-06
编写一个Shape类,具有属性:周长和面积: 定义其子类三角形和矩形,分别具有求周长的方法. 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a.b,使用对象a.b来 ...
- Atitit ocr识别原理 与概论 attilax总结
Atitit ocr识别原理 与概论 attilax总结 1.1. Ocr的过程与流程1 1.2. OCR不同技术细分略有不同,但大概原理是一样的. 即主要技术过程是:二值化(又叫归一化)----- ...
- js 判断字符串是否包含另外一个字符串
示例代码: <script type="text/javascript"> var str = "测试一个字符串(ehtrzes)是否包含另外一个字符串&qu ...
- javascript实现汉诺塔动画效果
javascript实现汉诺塔动画效果 当初以为不用html5也很简单,踩了javascript单线程的大坑后终于做出来了,没事可以研究下,对理解javascript的执行过程还是很有帮助的,代码很烂 ...
- 深入理解PHP内核(七)变量及数据类型-常量
原文链接:http://www.orlion.ga/246/ 在PHP中,常量的名字是一个简单值的标识符,在脚本执行期间该值不能改变.和变量一样,常量默认为大小写敏感,但是通常是大写的. 常量是在变量 ...