Model绑定
在Asp.net MVC中随着Controller被激活,接着选择Action执行,在Action执行前需要将来自http请求的数据绑定在其参数上这就是Model绑定。参数绑定主要包括
- 将Http请求数据封装到数据源
- 绑定参数的策略
- 集体执行策略
数据源提供
数据源的提供主要实现IValueProvider
,其实IValueProvider
是对一数据容器(主要有NameValueColection
和Dictory<T>
)的封装,通过IValueProvider
的前缀形式可访问容器内数据。
在执行时将所有注册的IValueProvider
数据源添加到ValueProviderCollection
集合中,在参数绑定时遍历所有IValueProvider
数据源。
系统提供的数据源有:
NameValueCollection
NameValueCollection
数据容器可存放key value数据,key为string
同样value
也必须是字符串类型,但容器不要去key的唯一性。对NameValueCollection
数据容器的封装有:
FormValueProvider
表达提交数据的数据源JQueryFormValueProvider
通过Jquery提交的表达数据QueryStringValueProvider
URL中的查询参数
Dictionary<string,T>
字典容器Dictionary<string,T>
,key具有唯一性,value可以存储对象类型。
RouteDataValueProvider
路由中需要的数据HttpFileCollectionValueProvider
文件的上传ChildActionValueProvider
通过@Html.Action("DataOfChildActionValueProvider", new { Foo = 123, Bar = 456, Baz = 789 })
子操作传输
自定义数据源
- 实现
IValueProvider
接口,这里数据容器根据需求可用NameValueCollection
或Dictionary<string,T>
,也可以自己定义 - 实现
ValueProviderFactory
,返回自定的ValueProvider
- 在呈现启动时注入
ValueProviderFactories
ModelBinder绑定策略
IModelBinder
的BindModel()
完成将数据源IValueProvider
的数据绑定到参数,通过实现IModelBinder
定义不同的绑定策略,系统根据参数的类型选择不同的绑定策略。
系统提供绑定方式
ByteArrayModelBinder
如果参数类型为byte[]
LinqBinaryModelBinder
HttpPostFileBaseModelBinder
文件上传对象HttpPostedFileBase
CancellationTokenModelBinder
DefaultModelBinder
当参数类型没有对应的绑定策略,采用DefaultModelBinder
实现IModelBinder
通过实现IModelBinder
定义自定义绑定策略,两种将自定义绑定策略注入的方式。
- 实现
IModelBinderProvider
,并在Application_Start()中注入ModelBinderProviders.BinderProviders.Add( new customBinderProvider())
- 直接通过key-value形式将数据类型-绑定策略存入字典
ModelBinders.Binders.Add()
实现CustomModelBinderAttribute
还有一种自定义绑定策略的方式,实现CustomModelBinderAttribute
特性绑定,可用将特性添加在类或参数上,但绑定策略的优先级不同。参数绑定策略的优先级为
CustomModelBinderAttribute
参数修饰-->ModelBinderProviders.BinderProviders
-->ModelBinders.Binders
-->1CustomModelBinderAttribute
类修饰--->DefaultModelBinder
绑定的实施
- 假设
Controller
已经被激活,执行ExecuteCore
,Controller
将调用IActionInvoker
的InvokeAction
方法。 ControllerActionInvoker
实现InvokeAction
系统中执行InvokeAction
的类,InvokeAction
中通过controllerContext
和actionDescriptor
得到所有的参数GetParameterValue
的到IModelBinder
和IValueProvider
新建ModelBindingContext
执行绑定策略binder.BindModel(controllerContext, bindingContext)