前言
公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出柘城免費(fèi)做網(wǎng)站回饋大家。
前面一篇講解了Model元數(shù)據(jù),Model元數(shù)據(jù)是在Model綁定中很重要的一部分,只是Model綁定中涉及的知識(shí)點(diǎn)比較多,對(duì)于ASP.NET MVC框架來說ASP.NET Web API框架中在Model綁定部分又新增了參數(shù)綁定這么一個(gè)機(jī)制,這些內(nèi)容都會(huì)在后面的篇幅中說明,前面的這些篇幅都是講解理論上的知識(shí)也沒有涉及到示例的演示,這個(gè)大家不用急在最后Model部分的基礎(chǔ)知識(shí)講解完之后我會(huì)把前面所講的全部串聯(lián)起來,而今天這個(gè)篇幅給大家?guī)淼木褪窃贛odel綁定中起到至關(guān)重要的一個(gè)環(huán)節(jié),大家這個(gè)不用去管什么Model綁定,而是單純的去了解ValueProvider這一系列的對(duì)象模型,因?yàn)樵跊]有結(jié)合前后知識(shí)點(diǎn)串聯(lián)起來之前,我們都不知道ValueProvider是在哪執(zhí)行的。所以我們還是老老實(shí)實(shí)了解一下ValueProvider相關(guān)的對(duì)象吧。
Model-ValueProvider
圖1
IValueProvider接口類型--ValueProvider行為約束
首先我們看一下圖1中右邊的部分,起頭的就是一個(gè)IValueProvider接口類型,我們就來看一下接口的定義:
示例代碼1-1
publicinterfaceIValueProvider { boolContainsPrefix(stringprefix); ValueProviderResultGetValue(stringkey); }
我們?cè)诖a1-1中看到,IValueProvider接口中定義了兩個(gè)方法,一個(gè)是ContainsPrefix()方法,接收string類型的參數(shù)并且返回的是bool值類型,這個(gè)方法表示的就是根據(jù)指定的前綴值查看當(dāng)前的ValueProvider中是否存在這個(gè)前綴值,這個(gè)下面會(huì)有示例稍后再說,然后就是GetValue()方法,是根據(jù)執(zhí)行的鍵值返回當(dāng)中的對(duì)應(yīng)的值,從這里一看我們就大概能猜到這個(gè)ValueProvider應(yīng)該是類似于鍵值隊(duì)一樣的類型,而返回的結(jié)果被封裝在了ValueProviderResult類型當(dāng)中,這個(gè)類型稍后會(huì)有說明。在IValueProvider接口約束好ValueProvider值提供程序的行為后,我們應(yīng)該就來看一看ValueProvider值提供程序的基礎(chǔ)結(jié)構(gòu)了。不過呢在此之前我們還是要根據(jù)圖1中所示的那樣,先來看一下IEnumerableValueProvider接口類型的定義,這個(gè)接口主要負(fù)責(zé)什么呢?
IEnumerableValueProvider接口類型-ValueProvider行為約束
示例代碼1-2
publicinterfaceIEnumerableValueProvider : IValueProvider { IDictionary<string, string>GetKeysFromPrefix(stringprefix); }
從代碼1-2中可以很清楚明了的看到IEnumerableValueProvider接口類型的職責(zé)很簡單,就是對(duì)指定的前綴值進(jìn)行檢索,并且最后以鍵值隊(duì)的形式返回,這個(gè)在下面會(huì)有示例詳細(xì)說明。
NameValuePairsValueProvider類型-ValueProvider基礎(chǔ)結(jié)構(gòu)
示例代碼1-3
publicclassNameValuePairsValueProvider : IEnumerableValueProvider, IValueProvider { publicNameValuePairsValueProvider(Func<IEnumerable<KeyValuePair<string, string>>>valuesFactory, CultureInfoculture); publicNameValuePairsValueProvider(IEnumerable<KeyValuePair<string, string>>values, CultureInfoculture); publicvirtualboolContainsPrefix(stringprefix); publicvirtualIDictionary<string, string>GetKeysFromPrefix(stringprefix); publicvirtualValueProviderResultGetValue(stringkey); }
在代碼1-3中我們看到NameValuePairsValueProvider類型的定義,首先就說說它的構(gòu)造函數(shù)吧,兩個(gè)構(gòu)造函數(shù)的區(qū)別在于第一個(gè)是Func<IEnumerable<KeyValuePair<string, string>>>類型的構(gòu)造函數(shù)參數(shù),第二個(gè)是IEnumerable<KeyValuePair<string, string>>類型的構(gòu)造函數(shù)參數(shù),第二個(gè)構(gòu)造函數(shù)的首個(gè)參數(shù)類型實(shí)際就是第一個(gè)構(gòu)造函數(shù)首個(gè)參數(shù)的返回類型,這里大家都看得到,其實(shí)在內(nèi)部實(shí)現(xiàn),也是這樣的聲明第一個(gè)構(gòu)造函數(shù)是沒什么的,聲明第二個(gè)構(gòu)造函數(shù)的時(shí)候其實(shí)就把參數(shù)再次封裝為委托。
對(duì)于KeyValuePair<T,U>類型可以理解為鍵值隊(duì)的子項(xiàng),在它的類型中只有一個(gè)鍵值對(duì)應(yīng)一個(gè)值只有一項(xiàng)就是它本身。
至于剩下的三個(gè)方法我們還是靠簡單的示例來說明一下。
示例代碼1-4
publicclassValueProviderCaseController : ApiController { publicstringGet() { KeyValuePair<string,string>[] dictionary=newKeyValuePair<string,string>[] { newKeyValuePair<string,string>("EmployeesInfo.Name","Jinyuan"), newKeyValuePair<string,string>("EmployeesInfo.Age","24"), newKeyValuePair<string,string>("EmployeesInfo.Sex","男"), newKeyValuePair<string,string>("EmployeesInfo.AddressInfo.AddressInfo","南京市"), newKeyValuePair<string,string>("EmployeesInfo.AddressInfo.ZipCode","210000") }; NameValuePairsValueProvidernameValuePairsValueProvider=newNameValuePairsValueProvider(dictionary,null); StringBuilderstrBuilder=newStringBuilder(); NameValuePairsPrefixAnalysis(strBuilder, nameValuePairsValueProvider, "EmployeesInfo"); returnstrBuilder.ToString(); } privatevoidNameValuePairsPrefixAnalysis(StringBuilderstringbuilder, NameValuePairsValueProvidernamevaluepairs,stringprefix) { IDictionary<string, string>dictionarys=namevaluepairs.GetKeysFromPrefix(prefix); if (dictionarys.Count>0) { Console.WriteLine(prefix+"為前綴的數(shù)據(jù)源Key值檢索……"); foreach (varitemindictionarys) { Console.WriteLine("Key:"+item.Key+" Value:"+item.Value); } foreach (KeyValuePair<string, string>keyvalueindictionarys) { NameValuePairsPrefixAnalysis(stringbuilder, namevaluepairs, keyvalue.Value); } } else { stringbuilder.AppendLine(prefix+":"+namevaluepairs.GetValue(prefix).RawValue.ToString()); } } }
我們來看代碼1-4,首先我在Get()方法中定義了一個(gè)KeyValuePair<string,string>[]類型,為了能夠?qū)嵗疦ameValuePairsValueProvider類型,在此之后大家可以看到我調(diào)用了一個(gè)我自定義的NameValuePairsPrefixAnalysis()方法,并且在其中使用NameValuePairsValueProvider類型的實(shí)例調(diào)用了GetKeysFromPrefix()方法,也就是代碼1-2所約束的那個(gè)行為。這個(gè)時(shí)候我們先來看一下表1.
表1
Key | Value |
EmployeesInfo.Name | Jinyuan |
EmployeesInfo.Age | 24 |
EmployeesInfo.Sex | 男 |
EmployeesInfo.AddressInfo.AddressInfo | 南京市 |
EmployeesInfo.AddressInfo.ZipCode | 210000 |
表1所表示的就是初始數(shù)據(jù)源,也就是我們定義的KeyValuePair<string,string>[]類型的鍵、值示意表。
然而在我們使用NameValuePairsValueProvider類型的實(shí)例已” EmployeesInfo”作為前綴調(diào)用了GetKeysFromPrefix()方法后返回的IDictionary<string,string>類型的值如表2.
表2
Key | Value |
Name | EmployeesInfo.Name |
Age | EmployeesInfo.Age |
Sex | EmployeesInfo.Sex |
AddressInfo | EmployeesInfo.AddressInfo |
這里的表2值只是第一層的關(guān)系值。
在此之后我們輸出的當(dāng)前的所要檢索的前綴值以及檢索過后的值,并且會(huì)遍歷表2里的Value值作為前綴值再次的對(duì)數(shù)據(jù)源進(jìn)行前綴檢索,如果沒有了則說明已經(jīng)沒有可檢索的了。
并且使用NameValuePairsValueProvider類型實(shí)例調(diào)用的GetValue()方法根據(jù)最后已經(jīng)檢索不出來有后綴的前綴值,也就是原始數(shù)據(jù)源當(dāng)中的Key值了。
最后我們看一下結(jié)果。
圖2
在客戶端我們獲取到了值,當(dāng)然這里只是演示示例,值提供程序提供的值方向反了。
然后我們可以在服務(wù)端看到檢索的記錄,可以明確的看到有兩層的結(jié)構(gòu)在其中。有興趣的朋友深入一下看下檢索的具體實(shí)現(xiàn)方式。
QueryStringValueProvider類型-ValueProvider特定結(jié)構(gòu)
示例代碼1-5
publicclassQueryStringValueProvider : NameValuePairsValueProvider { publicQueryStringValueProvider(HttpActionContextactionContext, CultureInfoculture) : base(func, culture) { Func<IEnumerable<KeyValuePair<string, string>>>func=null; if (func==null) { func= () =>actionContext.ControllerContext.Request.GetQueryNameValuePairs(); } } }
從代碼1-5中可以看到在QueryStringValueProvider類型初始化的時(shí)候構(gòu)造函數(shù)中的執(zhí)行,把從請(qǐng)求查詢字符串作為原始數(shù)據(jù)來源封裝為委托類型,然后調(diào)用基類的構(gòu)造函數(shù)。
RouteDataValueProvider類型-ValueProvider特定結(jié)構(gòu)
示例代碼1-6
publiccla***outeDataValueProvider : NameValuePairsValueProvider { publicRouteDataValueProvider(HttpActionContextactionContext, CultureInfoculture) : base(func, culture) { Func<IEnumerable<KeyValuePair<string, string>>>func=null; if (func==null) { func= () =>GetRoutes(actionContext.ControllerContext.RouteData); } } }
同上面1-5一樣的道理,這里使用了HttpRouteData中的Values值作為原始數(shù)據(jù)源。
還有圖1中的左邊部分會(huì)在后面的篇幅中講解,在這里講不適合,會(huì)感覺不連貫,雖然看完本篇不知道這個(gè)起到了什么作用也不知道怎么去使用,感覺被掐住了脖子一樣的難受,但是后面我會(huì)把前面所講的內(nèi)容全部串聯(lián)起來做一個(gè)演示,所示這是基礎(chǔ)部分的知識(shí),就是一個(gè)鋪墊。
標(biāo)題名稱:ASP.NETWebAPIModel-ValueProvider
本文來源:http://aaarwkj.com/article8/peipip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、搜索引擎優(yōu)化、Google、網(wǎng)站改版、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)