




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
大多數大多數MVC框架路由規則的配置都大同小異,一般都是通過模板的方式來配置路由規則。有的還Controller和Action上通過Attribute(Java中叫注解)進行更細粒度的配置。0x01Startup.cs所謂的路由的模板就是一串字符串,當接收到Http請求后取出其中的Path部分,和模板進行對app.UseMvc(routes{ name: te:其其中name為路由規則的名稱,tem 在模板"{controlleractionid}"中,用花括號括起來的是路由模板中的變量。例如其中變量的作用并不是必須在Path中匹配某個固定的字符串,而是起到一個占位的作用,例如上面的模板就可以匹配由“/”隔開的共三部分的Path,例如a/b/c可以匹配成功。而各個變量的值從PathHome/Index/12controllerHome,actionIndex,id12Home/Index則匹配失敗,因為只有2部分模板匹配成功后controlleraction提取出的值路由:Home/Index/12會路由到HomeControllerIndex方法,變量id12Test/Show/abTestControllerShow方法,變量idab一種是在方法的參數列表中加入和變量相同名稱的參數,MVC會自動從變量列表中尋找并轉換為對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中方法的名稱。為了讓每條路由規則都能夠路由到ControllerAction,在路由模板中都controlleraction變量,但我們也可以controlleraction變量指定默認值,這樣在Path中省略了這部分時會用默認值代替。app.UseMvc(routes{ name: te:或 name: te:defaults: controller= action= id=PathHomeController,Index方法Test會被路由到TestController,Index方的。例 給TestController的Show方法配置路由為TestShow,使用確可以路由到TestController的Show方法,但當Path為TestShow/Home/Index時會路由到HomeController的Index方法。使用第二種方法配置name: te:defaults: controller= action=PathPathTestShow時可以路由到TestControllerShow方法,但Path為Test/Home/Index則無法匹配模板。關于細粒度的路由配置更好的方法是給Test方法使用Route特性(Attribute)進行配置,后面會說到。Durow/Test/ShowDurow/Test/Show會路由到TestController,Show方法MyTest/MyShow會被路由到TestController,Show*PathController和Action可能不存在。實際應用中很可能會配置多條路由規則,當接收到Path時很可能不止一條規則能夠匹配。“{controller}/{action=About}”“{controller}/{action=Index當Path為Home時兩條路由都能匹配,那要怎么選擇呢?其實很簡 HomeHomeControllerAbout0x02AttributeController類和Action方法上使用Route特性。例如在TestController的Show方法上使用Route特性:[Route("TestShow")]publicIActionResult{return}name: te:defaults: controller= action= 樣的模板,除了TestShow外,當Path為Test/Show可以匹配這個模板并路由到TestController的Show方法。而通過在Show方法上配置Route特性后,只有TestShow才可以路由,即使同時存在”{controller}/{action}”這樣的模板,Test/Show也無法路由。第一Route特性配置路由時,我很疑惑路由組件是如Path路由到對應的ControllerAction的,后來下了RouteData對象,發現對于配置了路由的Action方法,其controller為方法所在的Controller的名稱,action為方法的名稱,而且在Route特性配置的路由模板中不能夠使用{controller}變量和{action}變量。這樣就保證了匹Path總能路由到這個Action。對于在Controller類上配置的Route特性最終會分別配置到Controller中的每個Action上。例如我TestControllerRoute(“TestShow”),實際上就是給每個方法配置了Route(“TestShow"),所以當Path為TestShow時會報錯,提示有兩個action滿足匹配。那么應當如何給ControllerRoute配置路由呢,可以使用[controller]和[action]。ControllerAction配置路由時,[controller]會被替Controller名稱,[action]會被替Action名稱。舉個例子還是給TestController配置Route特性,配置為Route(“durow/[controller]/[action]”),這樣對于其中Index方法來說,其路由模板為”durow/Test/Index”,controller為Test,action為Index。而對于Show方法來說路由模板為”durow/Test/Show”,controller為Test,action為Show。前面 MVC會為每個Action創建一個ActionDescriptor對象 這個Action的路由信息。對于配置了Route特性的Action(再重復一下,給Controller類配置Route特性相當于給Controller中的每個Action配置Route特性),其ActionDescriptor中會有一個AttributeRouteInfo對象,對于未配置Route特性的Action,該對象為空。AttributeRouteInfo中包含了路由模板信息。能達到同樣的效果。不過使用Route(“durow/[controller]/[action]”)語義更強更通用。在Route特性中配置模板也是可以使用變量的,同樣可以使用?標記變量可選。例如可以給TestController配置Route(“durow/[controller]/[action]/{id?}”)Route特性的模板中變量不能使用默認值(包括[controller]和[action]),也不能使用*Path所有剩0x03Area相關的規則就可以了。不過詳細了解了路由規則,當以后遇到有些奇葩的特殊需求時能夠0x000x00路由模板中的約不嫌麻煩的話在路由到的Action中對變量進行檢查也 合AOP的思路。這篇文章主要介紹路由模板中的約束。0x01這個這個id進行了約束,約束是通過冒號(:)實現的,冒號后為約束的內容。Int?代表id約束為int?類型,只有id能被轉int?類型模板匹配才算成功。即int.TryParse()true。Home/Index/123匹配成功,id123Home/Index/abc匹配失敗,因為abcint?Home/Index匹配成功,此時id和配置默認值一樣,除了直接在模板中配置外,也可以在MapRoute方法中通過傳入參數進行配name: te:defaults: controller= action=constraints: id=new效果效果是一樣的這個模板中id被約束為int類型且最小值為0。同樣的也可以以參數的方式配置 name: te:defaults: controller= action=constraints: id=new new new new 0x02NetCoreMVC中內建的約.NetCoreMVC中內建了大量的約束可供使用。其中大多數基于類型的約束都是使用該類型 }”}”例子double:double,對應的類為}”decimal:decimal,對應的類為}”例子例子約束為時間日期:datetime,對應的類為例子GUID:guid,對應的類為例子約束最小長度:minlength(len),對應的類為例子約束最大長度:maxlength(len),對應的類為例子例子約束最小值:min(v),對應的類為例子約束最大值:max(v),對應的類為例子約束范圍:range(min,max),對應的類為約束正則表達式:regex(exp),對應的類為例子:”{controller:regex(^My.*)=Home0x03創建自定義約boolHttpContext //Http上下文信IRouter //當前正在測試的模板信string //當前正在測試約束的變量名RouteValueDictionaryvalues模板中變量提取出的RouteDirectionrouteDirection)//路由方向,枚舉,值包 inRequestg和這個這個方法返回ture說明符合約束,返回false說 束,把id約束為偶數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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫保醫師協議管理辦法
- 公園日常運營管理辦法
- 公司創新管理辦法試行
- 原材料質量復查與檢測計劃
- 河南展會活動管理辦法
- 案例分析:校本行為干預:有效解決之道
- 旅游行業創新與節日營銷策略
- 安全隱患排查指南
- 內河游艇培訓管理辦法
- 江蘇灘涂用地管理辦法
- 檢驗科管理手冊
- 行車安全風險點告知牌
- 2019-2020鞍山八年第二學期語文期末考試帶答案
- 心臟粘液瘤超聲診斷
- 國家開放大學電大2022年春季期末考試《商務英語閱讀》試題試卷代號4050
- 2023年音樂考試真題
- NB/T 10751-2021礦用往復式氣動注漿泵
- 裝卸搬運課件
- GB/T 18391.2-2009信息技術元數據注冊系統(MDR)第2部分:分類
- GB/T 16924-2008鋼件的淬火與回火
- 基礎護理學:肌內注射
評論
0/150
提交評論