好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ASP.NET MVC三个重要的描述对象:ParameterDescriptor

ASP.NET MVC三个重要的描述对象:ParameterDescriptor

Model绑定是为作为目标Action的方法准备参数列表的过程,所以针对参数的描述才是Model绑定的核心。在ASP.NET MVC应用编程接口中,服务于Model绑定的参数元数据通过 ParameterDescriptor 类型来表示,而ActionDescriptor的GetParameters方法返回的就是一个ParameterDescriptor数组。

如下面的代码片断所示,ParameterDescriptor同样实现了ICustomAttributeProvider接口提供应用在相应参数上的特性。ParameterDescriptor的只读属性ActionDescriptor表示描述所在Action方法的ActionDescriptor对象。属性ParameterName、ParameterType和DefaultValue分别表示参数的名称、类型和默认值。

    1:   public   abstract   class  ParameterDescriptor : ICustomAttributeProvider
    2:  {   
    3:       public   virtual   object [] GetCustomAttributes( bool  inherit);
    4:       public   virtual   object [] GetCustomAttributes(Type attributeType,  bool  inherit);
    5:       public   virtual   bool  IsDefined(Type attributeType,  bool  inherit);
    6:      
    7:       public   abstract  ActionDescriptor ActionDescriptor { get; }
    8:       public   abstract   string  ParameterName { get; }
    9:       public   abstract  Type ParameterType { get; }
   10:       public   virtual   object  DefaultValue { get; }
   11:   
   12:       public   virtual  ParameterBindingInfo BindingInfo { get; }
   13:  }

ParameterDescriptor的只读属性BindingInfo表示的System.Web.Mvc.ParameterBindingInfo对象封装一些信息用于控制请求数据与参数的绑定行为。如下面的代码片断所示,抽象类ParameterBindingInfo具有四个属性,其中类型为IModelBinder的Binder属性返回的ModelBinder对象是整个Model绑定的核心,我们将在本章后续部分进行单独介绍。

    1:   public   abstract   class  ParameterBindingInfo
    2:  {
    3:       public   virtual  IModelBinder Binder { get; }
    4:      
    5:       public   virtual  ICollection< string > Include { get; }
    6:       public   virtual  ICollection< string > Exclude { get; }
    7:       public   virtual   string  Prefix { get; }
    8:  }

如果参数类型是一个复杂类型,默认情况下会绑定其所有公共可读写属性,而两个ICollection<string>类型的属性Include和Exclude表示显示设置的参与/不参与绑定的属性名称列表。在默认情况下,请求数据与参数之间严格按照名称进行绑定,但是有时候请求数据名称具有相应的前缀,这个前缀体现在ParameterBindingInfo的Prefix属性上。

ReflectedParameterDescriptor

原生的ParameterBindingInfo是通过针对表示参数的ParameterInfo进行反射获得,这样的ParameterBindingInfo通过 ReflectedParameterDescriptor 类型表示。如下面的代码片断所示,这个ParameterInfo对象通过只读属性ParameterInfo表示,并在构造函数中被初始化。

    1:   public   class  ReflectedParameterDescriptor : ParameterDescriptor
    2:  {   
    3:       public  ReflectedParameterDescriptor(ParameterInfo parameterInfo, ActionDescriptor actionDescriptor);
    4:       public   override   object [] GetCustomAttributes( bool  inherit);
    5:       public   override   object [] GetCustomAttributes(Type attributeType,  bool  inherit);
    6:       public   override   bool  IsDefined(Type attributeType,  bool  inherit);
    7:      
    8:       public   override  ActionDescriptor ActionDescriptor { get; }
    9:       public   override  ParameterBindingInfo BindingInfo { get; }
   10:       public   override   object  DefaultValue { get; }
   11:       public   override   string  ParameterName { get; }
   12:       public   override  Type ParameterType { get; }
   13:      
   14:       public  ParameterInfo ParameterInfo { get; }
   15:  }

ReflectedParameterDescriptor的BindingInfo属性返回的是一个ReflectedParameterBindingInfo对象,这是一个内部类型。该BindingInfo的Include、Exclude和Prefix属性来源于对应用在参数上的 BindAttribute 特性的解析。如下面的代码片断所示,BindAttribute中同样定义了这三个属性,其中Include和Exclude为通过逗号作为分隔符的属性名称列表。

    1:  [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Class, AllowMultiple= false , Inherited= true )]
    2:   public   sealed   class  BindAttribute : Attribute
    3:  {
    4:       public   bool  IsPropertyAllowed( string  propertyName);   
    5:      
    6:       public   string  Include { get; set; }
    7:       public   string  Exclude { get; set; }
    8:       public   string  Prefix { get; set;}
    9:  }

布尔返回类型的IsPropertyAllowed方法用于判断指定的属性是否允许绑定,当指定在属性名在Include列表中(或者Include列表为空)并且不在Exclude列表的情况下返回True,否则返回False。

ASP.NET MVC三个重要的描述对象:ControllerDescriptor  
ASP.NET MVC三个重要的描述对象:ActionDescriptor  
ASP.NET MVC三个重要的描述对象:ControllerDescriptor与ActionDescriptor的创建机制  
ASP.NET MVC三个重要的描述对象:ParameterDescriptor

作者: Artech
出处: http://artech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

分类:  [01] 技术剖析

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于ASP.NET MVC三个重要的描述对象:ParameterDescriptor的详细内容...

  阅读:43次