zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    ide 安装eval reset插件 Pycharm 永久破解
    Centos7.9安装RabbitMQ
    Linux环境下安装Centos7.9时没有图形界面的解决办法
    JS,对部分值base64解码
    consul 配置备份
    AutoMapper后遇到的“Missing map”与“Missing type map configuration”问题
    osg绘制圆柱体
    IfcFlowMovingDevice
    opencv absdiff
    IfcFlowMovingDeviceType
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/9542293.html
Copyright © 2011-2022 走看看