




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
大多數(shù)大多數(shù)MVC框架路由規(guī)則的配置都大同小異,一般都是通過(guò)模板的方式來(lái)配置路由規(guī)則。有的還Controller和Action上通過(guò)Attribute(Java中叫注解)進(jìn)行更細(xì)粒度的配置。0x01Startup.cs所謂的路由的模板就是一串字符串,當(dāng)接收到Http請(qǐng)求后取出其中的Path部分,和模板進(jìn)行對(duì)app.UseMvc(routes{ name: te:其其中name為路由規(guī)則的名稱,tem 在模板"{controlleractionid}"中,用花括號(hào)括起來(lái)的是路由模板中的變量。例如其中變量的作用并不是必須在Path中匹配某個(gè)固定的字符串,而是起到一個(gè)占位的作用,例如上面的模板就可以匹配由“/”隔開(kāi)的共三部分的Path,例如a/b/c可以匹配成功。而各個(gè)變量的值從PathHome/Index/12controllerHome,actionIndex,id12Home/Index則匹配失敗,因?yàn)橹挥?部分模板匹配成功后controlleraction提取出的值路由:Home/Index/12會(huì)路由到HomeControllerIndex方法,變量id12Test/Show/abTestControllerShow方法,變量idab一種是在方法的參數(shù)列表中加入和變量相同名稱的參數(shù),MVC會(huì)自動(dòng)從變量列表中尋找并轉(zhuǎn)換為對(duì)publicIActionResultIndex(stringid,stringcontroller,string{ViewData["Message"]="idis"+id+",controlleris"+controller+",actionis"return}另一種就是從RouteData中取出 publicIActionResult{varcontroller=varaction=varid=ViewData["Message"]="idis"+id+",controlleris"+controller+",actionis"return}路由路由模板中的變量名稱是可controlleraction(area)都是比較特殊的變量。controllerController的名稱,action提取出的值作為Controller中方法的名稱。為了讓每條路由規(guī)則都能夠路由到ControllerAction,在路由模板中都controlleraction變量,但我們也可以controlleraction變量指定默認(rèn)值,這樣在Path中省略了這部分時(shí)會(huì)用默認(rèn)值代替。app.UseMvc(routes{ name: te:或 name: te:defaults: controller= action= id=PathHomeController,Index方法Test會(huì)被路由到TestController,Index方的。例 給TestController的Show方法配置路由為T(mén)estShow,使用確可以路由到TestController的Show方法,但當(dāng)Path為T(mén)estShow/Home/Index時(shí)會(huì)路由到HomeController的Index方法。使用第二種方法配置name: te:defaults: controller= action=PathPathTestShow時(shí)可以路由到TestControllerShow方法,但Path為T(mén)est/Home/Index則無(wú)法匹配模板。關(guān)于細(xì)粒度的路由配置更好的方法是給Test方法使用Route特性(Attribute)進(jìn)行配置,后面會(huì)說(shuō)到。Durow/Test/ShowDurow/Test/Show會(huì)路由到TestController,Show方法MyTest/MyShow會(huì)被路由到TestController,Show*PathController和Action可能不存在。實(shí)際應(yīng)用中很可能會(huì)配置多條路由規(guī)則,當(dāng)接收到Path時(shí)很可能不止一條規(guī)則能夠匹配?!皗controller}/{action=About}”“{controller}/{action=Index當(dāng)Path為Home時(shí)兩條路由都能匹配,那要怎么選擇呢?其實(shí)很簡(jiǎn) HomeHomeControllerAbout0x02AttributeController類和Action方法上使用Route特性。例如在TestController的Show方法上使用Route特性:[Route("TestShow")]publicIActionResult{return}name: te:defaults: controller= action= 樣的模板,除了TestShow外,當(dāng)Path為T(mén)est/Show可以匹配這個(gè)模板并路由到TestController的Show方法。而通過(guò)在Show方法上配置Route特性后,只有TestShow才可以路由,即使同時(shí)存在”{controller}/{action}”這樣的模板,Test/Show也無(wú)法路由。第一Route特性配置路由時(shí),我很疑惑路由組件是如Path路由到對(duì)應(yīng)的ControllerAction的,后來(lái)下了RouteData對(duì)象,發(fā)現(xiàn)對(duì)于配置了路由的Action方法,其controller為方法所在的Controller的名稱,action為方法的名稱,而且在Route特性配置的路由模板中不能夠使用{controller}變量和{action}變量。這樣就保證了匹Path總能路由到這個(gè)Action。對(duì)于在Controller類上配置的Route特性最終會(huì)分別配置到Controller中的每個(gè)Action上。例如我TestControllerRoute(“TestShow”),實(shí)際上就是給每個(gè)方法配置了Route(“TestShow"),所以當(dāng)Path為T(mén)estShow時(shí)會(huì)報(bào)錯(cuò),提示有兩個(gè)action滿足匹配。那么應(yīng)當(dāng)如何給ControllerRoute配置路由呢,可以使用[controller]和[action]。ControllerAction配置路由時(shí),[controller]會(huì)被替Controller名稱,[action]會(huì)被替Action名稱。舉個(gè)例子還是給TestController配置Route特性,配置為Route(“durow/[controller]/[action]”),這樣對(duì)于其中Index方法來(lái)說(shuō),其路由模板為”durow/Test/Index”,controller為T(mén)est,action為Index。而對(duì)于Show方法來(lái)說(shuō)路由模板為”durow/Test/Show”,controller為T(mén)est,action為Show。前面 MVC會(huì)為每個(gè)Action創(chuàng)建一個(gè)ActionDescriptor對(duì)象 這個(gè)Action的路由信息。對(duì)于配置了Route特性的Action(再重復(fù)一下,給Controller類配置Route特性相當(dāng)于給Controller中的每個(gè)Action配置Route特性),其ActionDescriptor中會(huì)有一個(gè)AttributeRouteInfo對(duì)象,對(duì)于未配置Route特性的Action,該對(duì)象為空。AttributeRouteInfo中包含了路由模板信息。能達(dá)到同樣的效果。不過(guò)使用Route(“durow/[controller]/[action]”)語(yǔ)義更強(qiáng)更通用。在Route特性中配置模板也是可以使用變量的,同樣可以使用?標(biāo)記變量可選。例如可以給TestController配置Route(“durow/[controller]/[action]/{id?}”)Route特性的模板中變量不能使用默認(rèn)值(包括[controller]和[action]),也不能使用*Path所有剩0x03Area相關(guān)的規(guī)則就可以了。不過(guò)詳細(xì)了解了路由規(guī)則,當(dāng)以后遇到有些奇葩的特殊需求時(shí)能夠0x000x00路由模板中的約不嫌麻煩的話在路由到的Action中對(duì)變量進(jìn)行檢查也 合AOP的思路。這篇文章主要介紹路由模板中的約束。0x01這個(gè)這個(gè)id進(jìn)行了約束,約束是通過(guò)冒號(hào)(:)實(shí)現(xiàn)的,冒號(hào)后為約束的內(nèi)容。Int?代表id約束為int?類型,只有id能被轉(zhuǎn)int?類型模板匹配才算成功。即int.TryParse()true。Home/Index/123匹配成功,id123Home/Index/abc匹配失敗,因?yàn)閍bcint?Home/Index匹配成功,此時(shí)id和配置默認(rèn)值一樣,除了直接在模板中配置外,也可以在MapRoute方法中通過(guò)傳入?yún)?shù)進(jìn)行配name: te:defaults: controller= action=constraints: id=new效果效果是一樣的這個(gè)模板中id被約束為int類型且最小值為0。同樣的也可以以參數(shù)的方式配置 name: te:defaults: controller= action=constraints: id=new new new new 0x02NetCoreMVC中內(nèi)建的約.NetCoreMVC中內(nèi)建了大量的約束可供使用。其中大多數(shù)基于類型的約束都是使用該類型 }”}”例子double:double,對(duì)應(yīng)的類為}”decimal:decimal,對(duì)應(yīng)的類為}”例子例子約束為時(shí)間日期:datetime,對(duì)應(yīng)的類為例子GUID:guid,對(duì)應(yīng)的類為例子約束最小長(zhǎng)度:minlength(len),對(duì)應(yīng)的類為例子約束最大長(zhǎng)度:maxlength(len),對(duì)應(yīng)的類為例子例子約束最小值:min(v),對(duì)應(yīng)的類為例子約束最大值:max(v),對(duì)應(yīng)的類為例子約束范圍:range(min,max),對(duì)應(yīng)的類為約束正則表達(dá)式:regex(exp),對(duì)應(yīng)的類為例子:”{controller:regex(^My.*)=Home0x03創(chuàng)建自定義約boolHttpContext //Http上下文信IRouter //當(dāng)前正在測(cè)試的模板信string //當(dāng)前正在測(cè)試約束的變量名RouteValueDictionaryvalues模板中變量提取出的RouteDirectionrouteDirection)//路由方向,枚舉,值包 inRequestg和這個(gè)這個(gè)方法返回ture說(shuō)明符合約束,返回false說(shuō) 束,把id約束為偶數(shù)publicclassEvenRouteConstraint:{publicboolMatch(HttpContexthttpContext,IRouterroute,stringrouteKey,values,RouteDirection int if(!int.TryParse(values[routeKey].ToString(),out return returnid%2==}然后這樣配然后這樣配置路name: te:defaults: controller= action=constraints: id=new
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 會(huì)展項(xiàng)目執(zhí)行接待方案
- 屋頂光伏建設(shè)方案
- 餐飲租賃合同承租人權(quán)益保障與風(fēng)險(xiǎn)規(guī)避詳解
- 車輛借用與城市交通改善服務(wù)協(xié)議
- 成都房地產(chǎn)租賃代理合作協(xié)議書(shū)
- 太谷焊工考試題及答案
- 2026版《全品高考》選考復(fù)習(xí)方案生物838 課時(shí)作業(yè)(三十五) 神經(jīng)系統(tǒng)的分級(jí)調(diào)節(jié)及人腦的高級(jí)功能 含答案
- 個(gè)人財(cái)務(wù)出納擔(dān)保合同范本
- 食品法規(guī)面試題及答案
- 商業(yè)綜合體拆除作業(yè)免責(zé)協(xié)議
- 公司勞務(wù)派遣服務(wù)協(xié)議
- 醫(yī)院檢驗(yàn)科培訓(xùn)課件:《標(biāo)本溢灑處理流程》
- 九陽(yáng)豆?jié){機(jī)的推廣方案
- 通訊ACS510字節(jié)解釋-
- 中醫(yī)護(hù)理技術(shù)操作撳針技術(shù)操作流程與考核評(píng)分標(biāo)準(zhǔn)
- 路面彎沉溫度修正系數(shù)
- 選礦廠安裝施工方案設(shè)計(jì)
- 客戶關(guān)系管理程廣見(jiàn)介紹
- 仲景心法傳講系列四
- 消化內(nèi)科護(hù)士實(shí)習(xí)生入科教育54張課件
- (完整word版)餐券模板
評(píng)論
0/150
提交評(píng)論