Model绑定是指从URL提取数据,生成对应Action方法的参数这个过程。前面介绍的一系列Descriptor负责提供了控制器,行为方法和参数的元数据,ValueProvieder负责获取数据,剩下的Moder绑定则是利用上述两者的结果来最终达到Model的生成。ParameterDescriptor里面的BindingInfo(类型是ParameterBindingInfo)的Binder是一个实现了IModelBinder接口的对象,ModelBinder组件用于真正的Model绑定。
下面则先看组件的类图
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。
Model绑定除了把值绑定到Action方法的参数上,同样也会绑定到Controller的ViewData中,下图则是列举了ModelState相关的类。
ModelBindingContext:具有一系列来自于ParameterDescriptor的属性。ModelBinderContext的生成以及发挥作用如下图所示