asp.net core 系列 6 MVC框架路由(下)

一.URL 生成

  接著上篇講MVC的路由,MVC 應用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 鏈接。?生成 URL 可消除硬編碼 URL,使代碼更穩定、更易維護。?此部分重點介紹 MVC 提供的 URL 生成功能,并且僅涵蓋 URL 生成工作原理的基礎知識。?IUrlHelper?接口用于生成 URL,是 MVC 與路由之間的基礎結構的基礎部分。?在控制器、視圖和視圖組件中,可通過?Url?屬性找到?IUrlHelper?的實例。

        //// mvc 框架的ControllerBase類下//摘要://     Gets or sets the Microsoft.AspNetCore.Mvc.IUrlHelper.public IUrlHelper Url { get; set; }

  

  1.1 傳統路由下的url生成

    下面示例中,通過使用IUrlHelper接口在index頁面生成指向另一操作Destination的 URL超連接。

復制代碼
        [Route("Home/Index")]public IActionResult Index(){// Generates /Home/Destinationvar url = Url.Action("Destination");var urlAddress = "<a href=\"" + url + "\"  >Click on to the Destination</a>";ViewData["url"] = urlAddress;return View();}public IActionResult Destination(){return View();}// Index.cshtml     @Html.Raw(ViewData["url"].ToString())
復制代碼

    當加載index頁面后,點擊超連接"Click on to the Destination" 將進入后臺控制器的Destination操作中。

    上面的?Url.Action?示例假定使用傳統路由,但 URL 生成功能的工作方式與屬性路由相似,只不過概念不同。?在傳統路由中,路由值用于擴展模板。controller?和?action?的路由值通常出現在該模板中, 這種做法可行是因為通過路由匹配的 URL 遵守某項約定。 這里的擴展模板指的是routes.MapRoute來添加路由規則約定。

?

  1.2 屬性路由下的url生成

    在屬性路由中,controller?和?action?的路由值不能出現在模板中(也就是不會使用routes.MapRoute),它們用于查找要使用的模板。

復制代碼
      //首先不用傳統路由,去掉了routes.MapRoutepublic void Configure(IApplicationBuilder app){app.UseMvc();}[Route("")]public IActionResult Index(){// Generates /custom/url/to/destination var url = Url.Action("Destination");var urlAddress = "<a href=\"" + url + "\"  >"+url+"</a>";ViewData["url"] = urlAddress;return View();}[HttpGet("custom/url/to/destination")]public IActionResult Destination(){return View();}
復制代碼

    ?生成如下圖所示 :所以會生成與httpget配置的路徑一樣,是因為屬性路由下的url生成,它們用于查找要使用的模板。MVC 生成一個包含所有屬性路由操作的查找表,并匹配?controller?和?action?的值,以選擇要用于生成 URL 的路由模板。

  1.3 根據action名稱生成 URL

    Url.Action?(IUrlHelper?.?Action) 以及所有相關重載都基于這樣一種想法:用戶想通過指定控制器名稱和操作名稱來指定要鏈接的內容。

復制代碼
        [Route("")]public IActionResult Index(){// Generates /Home/Destination/1?color=redvar url = Url.Action("Destination","Home",new  { id=1 , color="red"});var urlAddress = "<a href=\"" + url + "\"  >" + url + "</a>";ViewData["url"] = urlAddress;return View();}public IActionResult Destination(int id,string color){return View();}    
復制代碼

  1.4 根據路由名稱生成 URL

    IUrlHelper?還提供?Url.RouteUrl?系列的方法。?這些方法類似于?Url.Action。Url.RouteUrl?指定一個路由名稱,以使用特定路由來生成 URL,通常不指定控制器或操作名稱。

復制代碼
        [Route("")]public IActionResult Index(){// Generates /custom/url/to/destinationvar url = Url.RouteUrl("Destination_Route");var urlAddress = "<a href=\"" + url + "\"  >Click on to the Destination</a>";ViewData["url"] = urlAddress;return View();}[HttpGet("custom/url/to/destination", Name = "Destination_Route")]public IActionResult Destination(){return View();}
復制代碼

  1.5? 其它生成

?    (1)在 HTML 中生成 URL: IHtmlHelper?提供?HtmlHelper?方法?Html.BeginForm?和?Html.ActionLink,可分別生成?<form>?和?<a>元素。?這些方法使用?Url.Action?方法來生成 URL,并且采用相似的參數。

    (2)在action中重定向:RedirectToAction("Index");?

?

二. area區域路由

    區域是一種 MVC 功能,用于將相關功能整理到一個組中,作為單獨的路由命名空間(用于控制器操作)和文件夾結構(用于視圖)。?通過使用區域,應用程序可以有多個名稱相同的控制器,只要它們具有不同的區域。?通過向?controller?和?action?添加另一個路由參數?area,可使用區域為路由創建層次結構。

    下面是mvc文件結構,對于users控制器,在視圖層多了一級Manage文件夾。如何使users控制器中AddUser操作關聯AddUser.cshtml呢,下面使用區域路由來實現:

復制代碼
          app.UseMvc(routes =>{//用于名為 Blog 的區域routes.MapAreaRoute("blog_route", "Blog","Manage/{controller}/{action}/{id?}");/** 注釋的MapRoute與上面的區域路由作用一樣routes.MapRoute("blog_route", "Manage/{controller}/{action}/{id?}",defaults: new { area = "Blog" }, constraints: new { area = "Blog" });*/routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");});
復制代碼
復制代碼
        //控制器上應用區域路由
       [Area("Blog")] public class UsersController : Controller{// GET: /<controller>/public IActionResult AddUser(){return View();}}
復制代碼

    在瀏覽器中輸入/Manage/Users/AddUser 將自動進入AddUser()中,這是因為當前路由:Manage/{controller}/{action}/{id?}符合blog模板,所以使用Blog區域路由。

  

?三. IActionConstraint 路由約束

    實現IActionConstraint最簡單的方法是創建派生自?System.Attribute?的類,并將其置于操作和控制器上。MVC 將自動發現任何應用屬性IActionConstraint的操作和控制器。

    在下面的示例中,約束基于路由數據中的國家/地區代碼選擇操作,開發人員負責實現Accept?方法,當路由中id值為en-US時Accept?方法返回?true?以表示該操作是匹配項,一切按正常解析返回客戶端。 如果Accept?方法返回false將不執行IActionConstraint標記的action,向客戶端返回404錯誤。

復制代碼
//定義ActionConstraint屬性約束
public class CountrySpecificAttribute : Attribute, IActionConstraint{private readonly string _countryCode;public CountrySpecificAttribute(string countryCode){_countryCode = countryCode;}public int Order{get{return 0;}}public bool Accept(ActionConstraintContext context){return string.Equals(context.RouteContext.RouteData.Values["id"].ToString(),_countryCode,StringComparison.OrdinalIgnoreCase);}}
復制代碼
復制代碼
      //應用路由的action約束,并且路由中id值為en-US[CountrySpecific("en-US")]public IActionResult Privacy(string countryCode){return View();}
復制代碼

    在瀏覽器測試時:如果輸入http://localhost:30081/home/Privacy/zh-cn,則網頁顯示404。如果輸入http://localhost:30081/home/Privacy/en-US 則符合約束,網頁顯示正常。

?

 

  參考文獻

  官方資料:asp.net core routing

?

轉載于:https://www.cnblogs.com/owenzh/p/11212514.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386355.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

爆贊!Android崗大廠面試官常問的那些問題,論程序員成長的正確姿勢

開頭 昨天去面了一家公司&#xff0c;價值觀有受到沖擊。 面試官技術方面沒的說&#xff0c;他可能是個完美主義的人&#xff0c;無論什么事情到了他那里好像都有解決的方案&#xff0c;我被說的無所適從&#xff0c;感覺他很厲害。 但我不能認可的是&#xff0c;面試官覺得…

Jenkins 中定時任務構建

一般&#xff0c;在Jenkins中搭建項目完成后&#xff0c;項目可正常運行&#xff0c;基本都會進行定時任務的構建。特別是重要的接口&#xff0c;進行關鍵接口自動化的日常巡檢 時&#xff0c;基本都會設置成定時任務&#xff0c;以方便每天&#xff0c;接口的自動化&#xff0…

爆贊!Jetpack-MVVM-高頻提問和解答,滿滿干貨指導

前言 今天我給大家再次分享一下&#xff0c;我最近的一些讀書的感想&#xff0c;思考起來&#xff0c;確實能夠給自己帶來一些真實的幫助和啟發&#xff0c;希望大家在平時的工作學習中&#xff0c;也能夠認清楚學習的一些本質。 如果我們的學習是在不斷掌握應對具體工作場景…

多線程控制不同的線程取不同的數據的問題

做項目的時候需要分析數據&#xff0c;數據量比較大用到多線程&#xff0c;剛開始接觸線程&#xff0c;想著線程應該平分數據&#xff0c;不應該取重復數據&#xff0c;采用了比較笨的方法&#xff0c;將數據的count取出&#xff0c;然后根據線程數平分&#xff0c;但是因為數據…

牛筆了!Android面試真題解析火爆全網,面試必備

開頭 最近有粉絲反應&#xff0c;不想做安卓了&#xff0c;有朋友轉到前端了&#xff0c;安卓不行了&#xff0c;問我怎么辦&#xff1f; 自從RN&#xff0c;Weex這種跨平臺編程語言出來以后&#xff0c;安卓將死的言論總是不絕于耳。隨著頗有摧枯拉朽之勢Flutter的出現&…

騰訊,字節等大廠面試真題匯總,深夜思考

前言 最近經常被朋友問到的兩個問題。 問題一&#xff1a; “從事IT工作3年了&#xff0c;做技術好累啊&#xff0c;是不是做到30歲就不能繼續往下做啊&#xff1f;”問題二&#xff1a; “我已經30歲了&#xff0c;還能不能學編程&#xff1f;” 我給出的答案是&#xff1a…

線性回歸原理小結

線性回歸可以說是機器學習中最基本的問題類型了&#xff0c;這里就對線性回歸的原理和算法做一個小結。 一、線性回歸的模型函數和損失函數 線性回歸遇到的問題一般是這樣的。我們有m個樣本&#xff0c;每個樣本對應于n維特征和一個結果輸出&#xff0c;如下&#xff1a; \((x_…

騰訊,字節等大廠面試真題匯總,進階學習資料!

前言 找工作還是需要大家不要緊張&#xff0c;有我們干這一行的接觸人本來就不多 難免看到面試官會緊張&#xff0c;主要是因為怕面試官問的問題到不上來&#xff0c;那時候不要著急 &#xff0c;答不上了的千萬不然胡扯一些&#xff0c;直接就給面試官說這塊我還沒接觸到&…

【題解】魚塘釣魚

題目描述 有N個魚塘排成一排&#xff08;N&#xff1c;100&#xff09;&#xff0c;每個魚塘中有一定數量的魚&#xff0c;例如&#xff1a;N5時&#xff0c;如下表&#xff1a; 即&#xff1a;在第1個魚塘中釣魚第1分鐘內可釣到10條魚&#xff0c;第2分鐘內只能釣到8條魚&…

騰訊,字節,阿里,小米,京東大廠Offer拿到手軟!分享一點面試小經驗

&#xff08;一&#xff09;簡介 Handler機制是一套Android消息傳遞機制。在Android開發多線程的應用場景中&#xff0c;將工作線程中需更新UI的操作信息 傳遞到 UI主線程&#xff0c;從而實現 工作線程對UI的更新處理&#xff0c;最終實現異步消息的處理。 在Android開發中&a…

騰訊,字節,阿里,小米,京東大廠Offer拿到手軟!絕對干貨

開頭 又到年底了&#xff0c;每到這個時候&#xff0c;我們都會慢慢反思&#xff0c;這一年都做了什么&#xff1f;有什么進步&#xff1f;年初的計劃都實現了嗎&#xff1f;明年年初有跳槽的底氣了嗎&#xff1f;況且今年的互聯網環境太差&#xff0c;需要自己有足夠的知識儲…

request對象與response對象

一.request對象 1.通過request對象可以獲得客戶端輸入的信息。request對象包含了從客戶端傳來的請求信息。 請求的參數是一個請求的組成部分&#xff0c;它們被作為字符串從客戶端傳送到JSP/Servlet容器中&#xff0c;并被用于初始化request對象。 2.request對象是javax.Servle…

騰訊,字節,阿里,小米,京東大廠Offer拿到手軟!講的明明白白!

緣起 隨著Android開發行業逐漸飽和&#xff0c;對Android開發者的面試要求也越來越高&#xff0c;是否掌握底層源碼&#xff0c;是面試官衡量一名Android開發者的重要依據。有沒有讀過源碼也可以很大程度上判斷你這個人的學習能力和思維方式。無論你開發經驗幾年&#xff0c;面…

HTML div 滾動條樣式設計

::-webkit-scrollbar-track-piece{ background-color:#fff;/*滾動條的背景顏色*/ -webkit-border-radius:0;/*滾動條的圓角寬度*/ } ::-webkit-scrollbar{ width:8px;/*滾動條的寬度*/ height:8px;/*滾動條的高度*/ } ::-webkit-scrollbar-thumb:vertical{/*垂直滾動條的樣式*/…

膜拜大佬!5年經驗Android程序員面試27天,高級面試題+解析

前言 網上關于啟動優化的文章多不勝數&#xff0c;內容千篇一律&#xff0c;大都是列舉一些耗時操作&#xff0c;采用異步加載、懶加載等。 而在面試過程中&#xff0c;關于啟動優化的問題&#xff0c;如果只是很表面地回答耗時操作應該放在子線程&#xff0c;顯然太過于普通…

膜拜大佬!不同層級的Android開發者的不同行為,社招面試心得

都說Android最近行情不好&#xff0c;很多人都遇到瓶頸或放棄或轉行。其實這種情況17年18年也是如此&#xff0c;相對比之下&#xff0c;個人認為今年比去年好多了&#xff0c;Android接下來將會走向復蘇的春天。 自從Google開始推出AMP項目已經有一年了。除此之外&#xff0c;…

zookeeper的四種類型的節點

znode創建類型(CreateMode),有以下四種&#xff1a; PERSISTENT 持久化節點PERSISTENT_SEQUENTIAL 順序自動編號持久化節點&#xff0c;這種節點會根據當前已存在的節點數自動加 1EPHEMERAL 臨時節點&#xff0c; 客戶端session超時這類節點…

膜拜大牛!Android開發最佳實踐手冊全網獨一份,終獲offer

前言 首先介紹一下自己&#xff0c;計算機水本&#xff0c;考研與我無緣。之前在帝都某公司算法部實習&#xff0c;公司算大公司吧&#xff0c;然而個人愛好偏開發&#xff0c;大二的時候寫個一個app&#xff0c;主要是用各種框架。 學習路徑&#xff1a;如何循序漸進、階段性…

英語每日一句

從今天開始學英語了&#xff1a;還蠻重要的。 It s not what I ask for.這不是我要的那樣。 你能寫出&#xff0c;你第一時間想到的一句英語嗎&#xff1f; 轉載于:https://www.cnblogs.com/igouz/archive/2008/11/28/1343014.html

膜拜大牛!HTTPS面試常問全解析,吊打面試官系列!

寫在前面 1月初失業&#xff0c;找了近2個多月的工作了&#xff0c;還沒找到心儀的工作&#xff0c;感覺心好慌&#xff0c;不知道該怎么辦了&#xff1f;找不到工作的時候壓力很大&#xff0c;有人說自信會很受打擊&#xff0c;還有人說會很絕望&#xff0c;是人生的低谷………