<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何在 ASP.NET Core 中使用 Route 特性

          共 4678字,需瀏覽 10分鐘

           ·

          2020-12-23 22:40

          ASP.NET Core 中的 Route 中間件的職責(zé)在于將 request 匹配到各自 Route 處理程序上,Route 分兩種:基于約定基本特性 模式。

          基于約定 模式的Route采用集中化的方式,而 基于特性 的方式允許你在 Action 或者 Controller 上單獨定義,到底采用哪一種可以基于你自己的應(yīng)用場景,本篇就來討論如何使用 基于特性 模式。

          創(chuàng)建 Controller 類

          創(chuàng)建一個 DefaultController 類,新增如下代碼。


          ????public?class?DefaultController?:?Controller
          ????{
          ????????[Route("")]
          ????????[Route("Default")]
          ????????[Route("Default/Index")]
          ????????public?ActionResult?Index()
          ????????{
          ????????????return?new?EmptyResult();
          ????????}
          ????????[Route("Default/GetRecordsById/{id}")]
          ????????public?ActionResult?GetRecordsById(int?id)
          ????????{
          ????????????string?str?=?string.Format
          ????????????("The?id?passed?as?parameter?is:?{0}",?id);
          ????????????return?Ok(str);
          ????????}
          ????}

          Controller 級別定義 Route 特性

          Route特性可用于 Controller 和 Action 級別,值得注意的是,如果應(yīng)到到前者,那么 Controller 下的所有 Action 都受這個 Route 管控。

          如果你仔細(xì)觀察上面的 DefaultController 類代碼,你會發(fā)現(xiàn)兩個 Action 方法的 Route 路徑都有 Default 前綴,這就不優(yōu)雅了,優(yōu)化方式就是把 Route 路徑中的 Default 提取到 Controller 級別,代碼如下:


          [Route("Default")]???
          public?class?DefaultController?:?Controller
          {
          ??[Route("")]
          ??[Route("Index")]
          ??public?ActionResult?Index()
          ??{
          ??????return?new?EmptyResult();
          ???}
          ??[HttpGet]
          ??[Route("GetRecordsById/{id}")]
          ??public?ActionResult?GetRecordsById(int?id)
          ??{
          ??????string?str?=?string.Format("The?id?passed?as?parameter?is:?{0}",?id);
          ??????return?Ok(str);
          ???}
          }

          可以看出當(dāng) Controller 和 Action 級別都被 Route 打上標(biāo)記之后,Asp.Net Core 中的 Route 引擎會自動將兩者拼接起來,當(dāng)然更簡單粗暴的做法就是在 Controller 上使用 RoutePrefix 特性,如下代碼所示:


          [RoutePrefix("services")]
          public?class?HomeController?:?Controller
          {
          ???//Action?methods
          }

          Action 級別定義 Route 特性

          參考剛才的 DefaultController 類,我在 Index 方法上面定義了三個 Route 特性,這就意味著下面三種 Route 都可以訪問到 Index() 方法,如下代碼所示:


          http://localhost:11277
          http://localhost:11277/home
          http://localhost:11277/home/index


          常常在 基于約定 模式的Route中,它的 Route template 會有一些對參數(shù)的約定,比如下面的代碼:


          ????????????app.UseEndpoints(endpoints?=>
          ????????????{
          ????????????????endpoints.MapControllerRoute(
          ????????????????????name:?"default",
          ????????????????????pattern:?"{controller=Home}/{action=Index}/{id?}");
          ????????????});

          同樣 基于特性 模式的 Route 也是可以使用參數(shù)模式的,比如文章之前的 DefaultController.GetRecordsById 就是的,值得注意的是模板中的 {id} 表示可接收任何參數(shù),如 string,int 等等,如果你想限定為 int 的話,也是可以實現(xiàn)的。

          使用 Route 約束

          Route 約束 就是 Controller 前的一個防火墻,他會踢掉一些不合規(guī)范的 Action 請求,比如說:你要求某個 Action 接收的參數(shù)必須是 int,那在 Route 模板中定義的語法格式一定是這樣的 {parameter:constraint},如下代碼所示:


          [Route("Default/GetRecordsById/{id:int}")]
          public?ActionResult?GetRecordsById(int?id)
          {
          ??string?str?=?string.Format("The?id?passed?as?parameter?is:?{0}",?id);
          ??return?Ok(str);
          }

          在 Route 中使用可選參數(shù)

          你也可以在 Route Template 上指定可選參數(shù),意味著這個參數(shù)可傳可不傳,格式如下:


          [Route("Sales/GetSalesByRegionId/{id?}")]

          有一點非常重要,當(dāng)你使用了 Route特性 之后,其實 Controller 或者 Action 的名字就不再重要了,因為 Route處理引擎 已經(jīng)不再將其作為參考選項,下面的代碼片段展示了如何在 Action 方法上變更 Route template 格式。


          [Route("Home/GetRecordsById/{id:int}")]
          public?ActionResult?GetRecordsById(int?id)
          {
          ???string?str?=?string.Format("The?id?passed?as?parameter?is:?{0}",?id);
          ???return?Ok(str);
          }

          接下來可以直接使用如下地址訪問 GetRecordsById 方法。


          http://localhost:11277/home/GetRecordsById/1

          對 Action 中的參數(shù)使用多個約束

          真實場景中你不僅要求 id 必須是整數(shù),還要求必須有一定意義,比如說最小值為1,對這種有 多重約束 的需求如何去實現(xiàn)呢?請看下面代碼。


          [Route("Default/GetRecordsById/{id:int:min(1)}")]
          public?ActionResult?GetRecordsById(int?id)
          {
          ????string?str?=?string.Format("The?id?passed?as?parameter?is:?{0}",?id);
          ????return?Ok(str);
          }

          常使用的 Route 約束

          • int ? ? ? 限定為 int 類型

          • max/min ? 限定 int 的最大數(shù)和最小數(shù)

          • minlength 限定 string 的最小長度

          • regex ? ? 限定符合的正則

          創(chuàng)建自定義的 Route 約束

          如果上面的一些約束不滿足你的要求,你完全可以為你的場景深度定制,做法就是使用 IRouteConstraint 接口并實現(xiàn)它的 Match 方法即可,如下代碼所示:


          ????public?class?CustomRouteConstraint?:?IRouteConstraint
          ????{
          ????????public?bool?Match(HttpContext?httpContext,?IRouter?route,
          ????????string?routeKey,
          ????????RouteValueDictionary?values,?RouteDirection?routeDirection
          )

          ????????{
          ????????????throw?new?NotImplementedException();
          ????????}
          ????}

          在 Controller 上使用 token 占位符

          所謂的 token 占位符 就是具有一些特定含義的占位符號,比如說:[action], [area] 和 [controller],分別表示用你真實的 Controller 和 Action 去替換,下面的代碼展示了如何使用這種模式去實現(xiàn)。


          [Route("[controller]/[action]")]
          public?class?HomeController?:?Controller
          {
          ???private?readonly?ILogger?_logger;
          ???public?HomeController(ILogger?logger)
          ???{
          ???????_logger?=?logger;
          ???}
          ???public?IActionResult?Index()
          ???{
          ???????return?View();
          ???}
          ???//Other?action?methods
          }

          整體來看,基于特性 的 Route 給了你更多的操控權(quán)限,靈活的 Route Template 配置實現(xiàn)了 Controller 和 Action 的解耦,當(dāng)然這里也不是說 基于約定 的Route 不好,畢竟人家是 Global 級別的,真實場景下兩者更多的是混著用。

          譯文鏈接:https://www.infoworld.com/article/3569369/how-to-use-attribute-routing-in-aspnet-core.html







          回復(fù)?【關(guān)閉】學(xué)關(guān)
          回復(fù)?【實戰(zhàn)】獲取20套實戰(zhàn)源碼
          回復(fù)?【被刪】學(xué)
          回復(fù)?【訪客】學(xué)
          回復(fù)?【小程序】學(xué)獲取15套【入門+實戰(zhàn)+賺錢】小程序源碼
          回復(fù)?【python】學(xué)微獲取全套0基礎(chǔ)Python知識手冊
          回復(fù)?【2019】獲取2019 .NET 開發(fā)者峰會資料PPT
          回復(fù)?【加群】加入dotnet微信交流群

          再見,VIP,臥槽又來一個看片神器!


          對抗流氓app開屏廣告,你需要這款神器!


          瀏覽 85
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  看中国毛片 | 欧美熟女一区二区 | 日韩中文字幕熟妇人妻 | 超碰在线网站 | 影音先锋在线看片av一区 |