ASP.NET MVC ParameterDescriptor 对象详细

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
    {  
        public virtual object[] GetCustomAttributes(bool inherit);
        public virtual object[] GetCustomAttributes(Type attributeType, bool inherit);
       public virtual bool IsDefined(Type attributeType, bool inherit);
       
        public abstract ActionDescriptor ActionDescriptor { get; }
        public abstract string ParameterName { get; }
       public abstract Type ParameterType { get; }
      public virtual object DefaultValue { get; }
   
       public virtual ParameterBindingInfo BindingInfo { get; }
   }

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

 代码如下 复制代码

    public abstract class ParameterBindingInfo
    {
       public virtual IModelBinder Binder { get; }
      
        public virtual ICollection<string> Include { get; }
       public virtual ICollection<string> Exclude { get; }
       public virtual string Prefix { get; }
   }

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

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

 代码如下 复制代码

    public class ReflectedParameterDescriptor : ParameterDescriptor
    {  
       public ReflectedParameterDescriptor(ParameterInfo parameterInfo, ActionDescriptor actionDescriptor);
        public override object[] GetCustomAttributes(bool inherit);
        public override object[] GetCustomAttributes(Type attributeType, bool inherit);
       public override bool IsDefined(Type attributeType, bool inherit);
       
        public override ActionDescriptor ActionDescriptor { get; }
        public override ParameterBindingInfo BindingInfo { get; }
       public override object DefaultValue { get; }
     public override string ParameterName { get; }
       public override Type ParameterType { get; }
     
       public ParameterInfo ParameterInfo { get; }
   }

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

 代码如下 复制代码

    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
    public sealed class BindAttribute : Attribute
   {
       public bool IsPropertyAllowed(string propertyName);  
      
       public string Include { get; set; }
       public string Exclude { get; set; }
       public string Prefix { get; set;}
  }

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

ParameterDescriptor 只是我们mvc三个重要对象中的其它一个,我们明后来接着来讲述关于ControllerDescriptor ,ActionDescriptor ,ControllerDescriptor与ActionDescriptor的创建机制。

时间: 2024-09-30 20:32:59

ASP.NET MVC ParameterDescriptor 对象详细的相关文章

asp.net MVC中Controller详细学习教程

本文我们详细介绍asp.net MVC开发模式中的C,Controller控制器. 1.Controller类 Controller的执行体现在对其Excute方法的调用,在IController这个接口里只定义了一个Excute方法,这个方法是以同步的方式执行的. public interface IController{ void Excute(RequestContext RequestContext);} 为了异步方式,在System.Web.Mvc.Async命名空间下定义了一个IAs

学习ASP.NET MVC系列 - 还有比这更简炼的吗?把复杂的事情变简单了,贡献啊!

转自   学习ASP.NET MVC系列: 学习ASP.NET MVC(一)--我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)--我的第一个ASP.NET MVC 控制器 学习ASP.NET MVC(三)--我的第一个ASP.NET MVC 视图 学习ASP.NET MVC(四)--我的第一个ASP.NET MVC 实体对象 学习ASP.NET MVC(五)--我的第一个ASP.NET MVC CURD页面 学习ASP.NET MVC(六)--我的第一个ASP.NET

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

Model绑定是为作为目标Action的方法准备参数列表的过程,所以针对参数的 描述才是Model绑定的核心.在ASP.NET MVC应用编程接口中,服务于Model绑定的 参数元数据通过ParameterDescriptor类型来表示,而ActionDescriptor的 GetParameters方法返回的就是一个ParameterDescriptor数组. 如下面的代码片断所示,ParameterDescriptor同样实现了 ICustomAttributeProvider接口提供应用在

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

ASP.NET MVC应用的请求都是针对某个Controller的某个Action方法,所以对 请求的处理最终体现在对目标Action方法的执行.而Action方法具有相应的参数 ,所以在方法执行之前必须根据相应的规则从请求中提取相应的数据并将其转换 为Action方法参数列表,我们将这个过程称为Model绑定.在ASP.NET MVC应用编 程接口中,Action方法某个参数的元数据通过ParameterDescriptor表示,而两个 相关的类型ControllerDescriptor和Ac

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

在Model绑定过程中会通过激活的Controller类型创建用于描述它的 ControllerDescriptor对象.Controller是一组Action方法的集合,而每一个 Action通过ActionDescriptor对象来表示,在这篇文章中我们就来着重谈谈不同 类型的ActionDescriptor.[本文已经同步到<How ASP.NET MVC Works?>中] 一.ActionDescriptor 用于描述定义在Controller类中的Action方法的ActionDe

ASP.NET MVC三个重要的描述对象:ControllerDescriptor和ActionDescriptor的创建

不论是用于描述Controller的ControllerDescriptor,还是用于描述Action方法的ActionDescriptor,都具有同步和异步两个版本,那么这些不同类型的ControllerDescriptor的ActionDescriptor是在什么情况下创建的呢? 一.ControllerActionInvoker与AsyncControllerActionInvoker ControllerDescriptor的创建设计到一个重要的名为ActionInvoker的组件,顾名

ASP.NET MVC三个重要的描述对象:ControllerDescriptor与ActionDescriptor

ControllerDescriptor与ActionDescriptor的创建 不论是用于描述Controller的ControllerDescriptor,还是用于描述Action方 法的ActionDescriptor,都具有同步和异步两个版本,那么这些不同类型的 ControllerDescriptor的ActionDescriptor是在什么情况下创建的呢? 一.ControllerActionInvoker与AsyncControllerActionInvoker Controlle

asp.net MVC 中的过滤器 ,一个路径设置对应一个过滤器类的对象吗

问题描述 asp.net MVC 中的过滤器 ,一个路径设置对应一个过滤器类的对象吗 asp.net MVC 中的过滤器 ,一个路径设置对应一个过滤器类的对象吗 .还是多个路由对应一个过滤器对象.有没有大神给讲解下路由和过滤器的对应关系代码如下:控制器代码: [CustAuthorize(""list"")] [Route(""list"")] public ActionResult List() { return View(

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    (5):前台Jquery easyUI实现    (6):EF上下文实例管理    (7):DBSession的封装   (8):DBSession线程内唯一     (9)