ASP.NET MVC三个重要的描述对象四:ParameterDescriptor
来源:互联网 发布:淘宝正确产品推广方法 编辑:程序博客网 时间:2024/05/16 08:06
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。
http://www.cnblogs.com/artech/archive/2012/05/13/parameter-descriptor.html
- ASP.NET MVC三个重要的描述对象四:ParameterDescriptor
- ASP.NET MVC三个重要的描述对象一:ControllerDescriptor
- ASP.NET MVC三个重要的描述对象二:ActionDescriptor
- ASP.NET MVC三个重要的描述对象三:ControllerDescriptor和ActionDescriptor的创建
- asp.net mvc源码分析-Action篇 ParameterDescriptor
- ASP.NET 重要对象 HttpApplication
- ASP.NET中的对象描述
- ASP.NET MVC 描述类型(一)
- ASP.NET MVC 描述类型(二)
- ASP.NET MVC 路由(四)
- ASP.NET MVC 过滤器(四)
- ASP.NET MVC 视图(四)
- [Asp.net mvc] Asp.net mvc Kendo UI Grid的使用(四)
- ASP.NET MVC 对象模型
- ASP.NET MVC下的四种验证编程方式
- ASP.NET MVC下的四种验证编程方式
- ASP.NET MVC下的四种验证编程方式
- ASP.NET MVC下的四种验证编程方式
- C/C++大文件/数据网络传输方法总结
- Tiny210开发板wm8960驱动
- POJ 3252 Round Numbers(数位dp)
- android之interpolator的用法详解
- as3工具类,开源包等
- ASP.NET MVC三个重要的描述对象四:ParameterDescriptor
- 符号数表示—原码 反码 补码
- Objective-C学习笔记(二十三)——面向对象之封装
- oracle sql积累
- xtrabackup备份方式搭建一个mysql slave
- Linux学习笔记
- Handler用法
- python中shutil模块
- 项目和工具地址