前进中的蜗牛

番茄大叔

水滴穿石,非一日之功;没有量变,何来质变。

Model绑定

Model绑定

在Asp.net MVC中随着Controller被激活,接着选择Action执行,在Action执行前需要将来自http请求的数据绑定在其参数上这就是Model绑定。参数绑定主要包括

  1. 将Http请求数据封装到数据源
  2. 绑定参数的策略
  3. 集体执行策略

数据源提供

数据源的提供主要实现IValueProvider,其实IValueProvider是对一数据容器(主要有NameValueColectionDictory<T>)的封装,通过IValueProvider的前缀形式可访问容器内数据。
在执行时将所有注册的IValueProvider数据源添加到ValueProviderCollection集合中,在参数绑定时遍历所有IValueProvider数据源。
系统提供的数据源有:

NameValueCollection

NameValueCollection数据容器可存放key value数据,key为string同样value也必须是字符串类型,但容器不要去key的唯一性。对NameValueCollection数据容器的封装有:

  • FormValueProvider表达提交数据的数据源
  • JQueryFormValueProvider通过Jquery提交的表达数据
  • QueryStringValueProviderURL中的查询参数

Dictionary<string,T>

字典容器Dictionary<string,T>,key具有唯一性,value可以存储对象类型。

  • RouteDataValueProvider路由中需要的数据
  • HttpFileCollectionValueProvider 文件的上传
  • ChildActionValueProvider通过@Html.Action("DataOfChildActionValueProvider", new { Foo = 123, Bar = 456, Baz = 789 })子操作传输

自定义数据源

  1. 实现IValueProvider接口,这里数据容器根据需求可用NameValueCollectionDictionary<string,T>,也可以自己定义
  2. 实现ValueProviderFactory,返回自定的ValueProvider
  3. 在呈现启动时注入ValueProviderFactories

ModelBinder绑定策略

IModelBinderBindModel()完成将数据源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

绑定的实施

  1. 假设Controller已经被激活,执行ExecuteCore,Controller将调用IActionInvokerInvokeAction方法。
  2. ControllerActionInvoker实现InvokeAction系统中执行InvokeAction的类,
  3. InvokeAction中通过controllerContextactionDescriptor得到所有的参数
  4. GetParameterValue的到IModelBinderIValueProvider新建ModelBindingContext执行绑定策略binder.BindModel(controllerContext, bindingContext)
posted @ 2018-08-27 15:05  LoveTomato  阅读(222)  评论(0编辑  收藏  举报