• 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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    【Python之路】第三篇--Python基本数据类型
    【Python之路】第二篇--初识Python
    【Python之路】第一篇--Linux基础命令
    noip模拟测试7
    noip模拟测试6
    动态添加select的option [转载]
    javaweb报错:java.lang.NumberFormatException: null
    Javascript获取select的选中值和选中文本(转载)
    动态生成select框内容
    IO(Input&Output)流の介绍
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2508125.html
Copyright © 2020-2023  润新知