閱讀473 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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


作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接

最後更新:2017-10-26 11:34:28

  上一篇:go  ASP.NET MVC三個重要的描述對象:ControllerDescriptor和ActionDescriptor的創建
  下一篇:go  通過ASP.NET Web API + JQuery創建一個簡單的Web應用