在上篇中介紹了自動綁定的基本用法,在本篇中,我們將深入了解自動綁定的工作原理.
自動綁定的確是讓人感到興奮的特性,然而,為了讓它可以在我們的項目中更好的工作,我們有必要深入了解如何更進一步細調該特性以及它是如何工作的.而本文正式即將揭開這個謎底.
為了更好的了解該特性,我們有必要到codeplex去下載一份asp.net mvc的源代碼並分析之,在本文寫作的時候,codeplex上已經放上了beta版的源碼,如果想進一步了解的朋友可以下載並對照本文分析.
在beta版中,新增了自動綁定這一特性,並對綁定特性做了一定的修改
新增BindAttribute:自動綁定特性設置
修改DefaultModelBinder:自動綁定的實現部分
修改ControllerActionInvoker:綁定的調用入口
新增ModelBinderContext,封裝綁定所需數據
新增BinderResult,封裝綁定結果
其他不大重要的修改略過
我們一步步來分析綁定的執行過程,首先肯定在ControllerActionInvoker中,看到GetParameterValue方法:
這兒便是對每個參數都嘗試調用ModelBinder來綁定參數,這兒的GetModelBinder方法和P5的一樣,在我們自定義ModelBinder的情況下可以進行自定義綁定,然而在自動綁定的時候獲取的則是DefaultModelBinder,然後在GetPropertyFilter方法中通過查閱BindAttribute來獲取關於綁定的設置.最後對數據進行綁定.
關鍵的,我們需要對DefaultModelBinder進行分析,然而在此之前,還有一個類也是需要我們仔細看看的,那就是BindAttribute,該特性是用來修飾參數的,它有4個重要的屬性:Include,Exclude,Prefix和一個方法:IsPropertyAllowed,分別用來設定:綁定的字段,不綁定的字段,參數前綴和判斷給定的字段是否設定運行綁定,且該方法會作為一個Predicate<string>委托封入ModelBinderContext傳入BindModel方法.
現在來討論使用默認綁定的情況,首先給出DefaultModelBinder的所有方法: