zoukankan      html  css  js  c++  java
  • 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的生成以及发挥作用如下图所示

  • 相关阅读:
    诺基亚e71收不到彩信的解决办法
    calloc(), malloc(), realloc(), free(),alloca()
    win7下移动硬盘不能安全删除的解决方法
    C语言指针总结
    复制和剪切到底谁快?
    IC设计流程
    请用真正的原版电驴(eMule)!VeryCD是假电驴!
    [置顶] 图片检索,船,古代, 三桅, 三角帆船,侧滑浆
    [置顶] "在证书存储区中找不到清单签名证书"问题分析以及解决方案
    [置顶] sql2008 用户映射问题
  • 原文地址:https://www.cnblogs.com/HopeGi/p/3993858.html
Copyright © 2011-2022 走看看