天天看點

通過執行個體模拟ASP.NET MVC的Model綁定的機制:集合+字典一、集合二、 字典

這裡的集合指的是除數組和字典之外的所有實作IEnumerable<T>接口的類型。和基于數組的Model綁定類似,ValueProvider可以将多個同名的資料項作為集合的元素,基于索引(基零整數和字元串)的資料項命名方式同樣适用。我們對自定義的DefaultModelBinder作了如下的完善使之支援集合類型的Model綁定。

如上面的代碼片斷所示,在BindModel方法中我們通過調用ExtractGenericInterface判斷目标類型是否實作了IEnumerable<T>接口,如果實作了該接口則提取泛型元素類型。針對集合的Model綁定實作在方法BindCollectionModel中,我們按照數組綁定的方式得的針對目标集合對象的所有元素對象,并将其添加到一個List<object>對象中,然後調用ReplaceHelper

的靜态方法ReplaceCollection将該清單中的元素拷貝到預先建立的Model對象中。定義在ReplaceHelper的靜态方法ReplaceCollection定義如下:

為了讓示範針對集合類型的Model綁定,我們對執行個體中的HomeController作了如下的修改。Action方法的參數類型替換成IEnumerable<Contact>,該集合中的每個Contact的資訊在該方法中被呈現出來。通過GetValueProvider提供的NameValueCollectionValueProvider采用基零整數索引的方式定義資料項。

該程式被執行之後,在浏覽器上依然會呈現出如下所示的我們希望的資料,這充分證明了我們自定義的DefaultModelBinder具有針對集合的綁定能力。

這裡的字典指的是實作了接口IDictionary<TKey,TValue>的類型。在Model綁定過程中基于字典類型的資料映射很好了解,首先,字典是一個KeyValuePair<TKey,TValue>對象的集合,是以在字典元素這一級可以采用基于索引的比對機制;其次,KeyValuePair<TKey,TValue>是一個複雜類型,可以按照屬性名稱(Key和Value)進行比對。比如說作為某個ValueProvider資料源的NameValueCollection具有如下的結構,它可以映射為一個IDictionary<string,

Contact>對象(Contact對象作為Value,其Name屬性作為Key)。

現在我們對用于模拟預設Model綁定的自定義DefaultModelBinder作最後的完善,使之支援針對字典類型的Model綁定。如下面的代碼片斷所示,在通過調用CreateModel建立Model對象之後,我們調用ExtractGenericInterface方法判斷目标類型是否是一個字典,如果是則傳回具體的字典類型,然後調用BindDictionaryModel方法實施針對字典類型的Model綁定。

在BindDictionaryModel方法中,我們采用與數組/集合綁定一樣的方式調用GetIndexes方法得到索引清單。在對該清單進行周遊過程中,我們在索引的基礎上添加“.Key”和“.Value”字尾進而得到作為字典元素(KeyValuePair<TKey,

TValue>)Key和Value對象的字首,并将該字首作為參數遞歸地調用BindModel方法得到具體作為Key和Value的對象。在得到字典元素Key和Value之後,我們建立一個KeyValuePair<object,

object>對象并添加預先建立的清單中。最後我們調用ReplaceHelper的靜态方法ReplaceDictionary将該清單拷貝到作為Model的字典對象中,ReplaceHelper的靜态方法ReplaceDictionary定義如下。

我們照例通過我們建立的執行個體程式來驗證自定義的DefaultModelBinder是否能夠支援針對字典的Model綁定。如下面的代碼片斷所示,我們讓HomeController的Action方法接受一個IDictionary<string,

Contact>類型的參數,并在該方法中将作為Key的字元串和作為Value的Contact的相關資訊呈現出來。在GetValueProvider方法中提供的NameValueCollectionValueProvider按照相應的映射規則對綁定到字典對象的資料項。

程式運作之後會在浏覽器中得到如下的我們期望的輸出結果。(S520)

<a href="http://www.cnblogs.com/artech/archive/2012/05/23/default-model-binding-01.html">通過執行個體模拟ASP.NET MVC的Model綁定的機制:簡單類型+複雜類型</a>

<a href="http://www.cnblogs.com/artech/archive/2012/05/30/default-model-binding-02.html">通過執行個體模拟ASP.NET MVC的Model綁定的機制:數組</a>

<a href="http://www.cnblogs.com/artech/archive/2012/05/31/default-model-binding-03.html">通過執行個體模拟ASP.NET MVC的Model綁定的機制:集合+字典</a>

作者:蔣金楠

微信公衆賬号:大内老A

如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識别二維碼)關注個人公衆号(原來公衆帳号蔣金楠的自媒體将會停用)。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

<a href="http://www.cnblogs.com/artech/archive/2012/05/31/default-model-binding-03.html" target="_blank">原文連結</a>

繼續閱讀