Model绑定是为作为目标Action的方法准备参数列表的过程,所以针对参数的描述才是Model绑定的核心。在ASP.NET MVC应用编程接口中,服务于Model绑定的参数元数据通过ParameterDescriptor类型来表示,而ActionDescriptor的GetParameters方法返回的就是一个ParameterDescriptor数组。
如下面的代码片断所示,ParameterDescriptor同样实现了ICustomAttributeProvider接口提供应用在相应参数上的特性。ParameterDescriptor的只读属性ActionDescriptor表示描述所在Action方法的ActionDescriptor对象。属性ParameterName、ParameterType和DefaultValue分别表示参数的名称、类型和默认值。
代码如下 | 复制代码 |
public abstract class ParameterDescriptor : ICustomAttributeProvider |
ParameterDescriptor的只读属性BindingInfo表示的System.Web.Mvc.ParameterBindingInfo对象封装一些信息用于控制请求数据与参数的绑定行为。如下面的代码片断所示,抽象类ParameterBindingInfo具有四个属性,其中类型为IModelBinder的Binder属性返回的ModelBinder对象是整个Model绑定的核心,我们将在本章后续部分进行单独介绍。
代码如下 | 复制代码 |
public abstract class ParameterBindingInfo |
如果参数类型是一个复杂类型,默认情况下会绑定其所有公共可读写属性,而两个ICollection
ReflectedParameterDescriptor
原生的ParameterBindingInfo是通过针对表示参数的ParameterInfo进行反射获得,这样的ParameterBindingInfo通过ReflectedParameterDescriptor类型表示。如下面的代码片断所示,这个ParameterInfo对象通过只读属性ParameterInfo表示,并在构造函数中被初始化。
代码如下 | 复制代码 |
public class ReflectedParameterDescriptor : ParameterDescriptor |
ReflectedParameterDescriptor的BindingInfo属性返回的是一个ReflectedParameterBindingInfo对象,这是一个内部类型。该BindingInfo的Include、Exclude和Prefix属性来源于对应用在参数上的BindAttribute特性的解析。如下面的代码片断所示,BindAttribute中同样定义了这三个属性,其中Include和Exclude为通过逗号作为分隔符的属性名称列表。
代码如下 | 复制代码 |
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Class, AllowMultiple=false, Inherited=true)] |
布尔返回类型的IsPropertyAllowed方法用于判断指定的属性是否允许绑定,当指定在属性名在Include列表中(或者Include列表为空)并且不在Exclude列表的情况下返回True,否则返回False。
总结:
ParameterDescriptor 只是我们mvc三个重要对象中的其它一个,我们明后来接着来讲述关于ControllerDescriptor ,ActionDescriptor ,ControllerDescriptor与ActionDescriptor的创建机制。
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级