Blazor學習之旅 (6) 路由系統

a5d40032d88afc332a54efbdd21882a5.jpeg

【Blazor】|?總結/Edison Zhou


大家好,我是Edison。許久沒有更新Blazor學習系列了,今天續更。

Blazor 的路由系統就和 ASP.NET MVC的路由系統一樣,可以為我們提供靈活的選項,可用于確保用戶請求到達可處理它們并返回用戶想要的信息的組件。

本篇,我們來了解下在Blazor中的路由系統。

使用路由模板

在 Blazor 中,使用路由來確保將每個請求發送到最適合的組件,并且該組件具有顯示用戶所需內容的全部信息。

Blazor 使用名為 Router 組件的專用組件路由請求。它在 App.razor 中配置如下:

<Router AppAssembly="@typeof(App).Assembly"><Found Context="routeData"><RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /><FocusOnNavigate RouteData="@routeData" Selector="h1" /></Found><NotFound><PageTitle>Not found</PageTitle><LayoutView Layout="@typeof(MainLayout)"><p role="alert">Sorry, there's nothing at this address.</p></LayoutView></NotFound>
</Router>

應用啟動時,Blazor 會檢查 AppAssembly 屬性,以了解它應掃描哪個程序集。它會掃描該程序集,以尋找具有 RouteAttribute 的組件。Blazor 使用這些值編譯 RouteData 對象,該對象指定如何將請求路由到組件。編寫應用代碼時,可以在每個組件中使用?@page 指令來修復 RouteAttribute。

在上面的模板中,標記指定了在運行時處理路由的組件:RouteView組件。此組件接收 RouteData 對象以及來自 URI 或查詢字符串的任何參數。然后,它呈現指定的組件及其布局。可以使用??標記來指定默認布局,當所選組件未通過?@layout 指令指定布局時,將使用該布局。本模塊稍后會詳細介紹這些布局。

在??組件中,還可使用??標記指定在不存在匹配路由時返回給用戶的內容。上面的示例返回單個?

?段落和錯誤消息提示"Sorry, there's nothing at this address.",但你可以呈現更復雜的 HTML。例如,可能包括指向主頁或站點管理員聯系人頁面的鏈接。

使用@page指令

在 Blazor 組件中,@page 指令指定該組件應直接處理請求。

可以在?@page 指令中指定 RouteAttribute,方法是以字符串的形式傳遞它。例如,使用此屬性指定頁面處理對 /Todo 路由的請求:

@page "/Todo"

如果要指定到組件的多個路由,請使用兩個或更多?@page 指令:

@page "/Todo"
@page "/TodoItems"

使用NavigationManager導航

在 Blazor 組件中,如果我們需要訪問一些導航信息,如當前完整的URI、相對路徑 又或是 查詢字符串(QueryString)等,我們可以在代碼中通過 NavigationManager 對象來獲取所有的這些值。

需要注意的是,我們需要將其注入組件,才能訪問其屬性。如下代碼所示,我們通過@inject指令完成了注入。

@page "/pizzas"
@inject NavigationManager NavManager<h1>Buy a Pizza</h1><p>I want to order a: @PizzaName</p><a href=@HomePageURI>Home Page</a>@code {[Parameter]public string PizzaName { get; set; }public string HomePageURI { get; set; }protected override void OnInitialized(){HomePageURI = NavManager.BaseUri}
}

如果想要訪問查詢字符串(QueryString),則必須分析完整的URI了。我們可以使用 Microsoft.AspNetCore.WebUtilities 程序集中的?

QueryHelpers 類執行此分析,如下代碼所示:

@page "/pizzas"
@using Microsoft.AspNetCore.WebUtilities
@inject NavigationManager NavManager<h1>Buy a Pizza</h1><p>I want to order a: @PizzaName</p><p>I want to add this topping: @ToppingName</p>@code {[Parameter]public string PizzaName { get; set; }private string ToppingName { get; set; }protected override void OnInitialized(){StringValues extraTopping;var uri = NavManager.ToAbsoluteUri(NavManager.Uri);if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("extratopping", out extraTopping)){ToppingName = System.Convert.ToString(extraTopping);}}
}

最后,我們還可以通過調用 NavigationManager.NavigateTo()?方法,使用 NavigationManager 對象將用戶轉交給代碼中的另一個組件:

@page "/pizzas/{pizzaname}"
@inject NavigationManager NavManager<h1>Buy a Pizza</h1><p>I want to order a: @PizzaName</p><button class="btn" @onclick="NavigateToPaymentPage">
Buy this pizza!
</button>@code {[Parameter]public string PizzaName { get; set; }private void NavigateToPaymentPage(){NavManager.NavigateTo("buypizza");}
}

使用NavLink組件

在 Blazor 中,使用 NavLink 組件來呈現標記,因為它在鏈接的 href 屬性與當前 URL 匹配時將切換 active CSS 類。通過設置 active 類的樣式,可以讓用戶清楚地了解當前頁面對應哪個導航鏈接。

使用 NavLink 時,主頁鏈接示例如以下代碼所示:

@page "/pizzas"
@inject NavigationManager NavManager<h1>Buy a Pizza</h1><p>I want to order a: @PizzaName</p><NavLink href=@HomePageUri Match="NavLinkMatch.All">Home Page</NavLink>@code {[Parameter]public string PizzaName { get; set; }public string HomePageURI { get; set; }protected override void OnInitialized(){HomePageURI = NavManager.BaseUri}
}

NavLink 組件中的 Match 屬性用于管理突出顯示連接的時間,它有兩個選項:

  • NavLinkMatch.All:使用此值時,只有在鏈接的 href 與當前 URL 完全匹配時,該鏈接才突出顯示為活動鏈接。

  • NavLinkMatch.Prefix:使用此值時,當鏈接的 href 與當前 URL 的第一部分匹配時,該鏈接就突出顯示為活動鏈接。例如,假設你擁有鏈接?

    。當前 URL 為?http://www.mypizza.com/pizzas?及該 URL 中的任意位置(例如?http://www.mypizza.com/pizzas/formaggio)時,此鏈接將突出顯示為活動鏈接。此行為可幫助用戶了解自己當前正在查看網站的哪一部分。

使用路由參數

在日常開發中,有時候希望將URI中的其他部分用作呈現的頁面中的值,例如:http://edtalk.com/favoritestar/jaychou。如果我們想要在Blazor中獲取到jaychou,就可以使用路由參數。

下面的示例代碼就展示了@page 指令中使用大括號來指定路由參數并為其命名。

@page "/Favorite/{favorite}"<h1>Choose a Star</h1><p>Your favorite star is: @Favorite</p>@code {[Parameter]public string Favorite { get; set; }
}

如果該路由參數并不是必須的,我們可以設置默認值,使其成為可選的路由參數。

@code {[Parameter]public string Favorite { get; set; }protected override void OnInitialized(){Favorite ??= "Fiorentina";}
}

假如用戶嘗試通過請求URI http://edtalk.com/favoritestar/jaychou/edisonchen 來指定兩個最喜愛的明星,頁面將顯示:"Your favorite start is : jaychou",并忽略后續的"edisonchen"。因此,如果我們想要顯示的是"jaychou/edisonchen",那么我們可以捕獲全部路由參數,只需要做以下一點點的修改,將星號 (*) 作為路由參數名稱前綴即可捕獲:

@page "/Favorite/{*favorites}"<h1>Choose a Star</h1><p>Your favorites star are: @Favorites</p>@code {[Parameter]public string Favorites { get; set; }
}

此外,我們可以對路由參數做類型限制,比如將其限制為一個int類型:

@page "/myorders/{orderId:int}"

除了int之外,還闊以添加的約束有 bool, datetime, decimal, double, float, guid 和 long 類型。

小結

本篇,我們了解了在Blazor中的路由系統。

下一篇,我們學習一下在Blazor中的布局系統。

參考資料

Microsoft Learn,《使用Blazor構建Web應用程序》

8004ef015547481352b1e4879c897aff.gif

年終總結:Edison的2021年終總結

數字化轉型:我在傳統企業做數字化轉型

C#刷題:C#刷劍指Offer算法題系列文章目錄

.NET面試:.NET開發面試知識體系

.NET大會:2020年中國.NET開發者大會PDF資料

c369ad95032301476ebc35d4451f9efb.png

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

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

相關文章

kindle降級卡大樹_從提示框:Kindle購物流程圖,iOS降級和DIY焊接筆

kindle降級卡大樹Once a week we round up some of the tips from the HTG tips box and share them with the greater readership; this week we’re looking at shopping for Kindles with a flowchart, downgrading iOS, and rolling your own DIY soldering pen. 每周一次&…

MS CRM 2011 Form與Web Resource在JScript中的相互調用

原創地址&#xff1a;http://www.cnblogs.com/jfzhu/archive/2013/02/14/2912580.html 轉載請注明出處 在Form中可以添加一個html的web resource&#xff0c;在web resource里可以用JScript來使用REST Endpoint或者SOAD Endpoint。 你可以在Form中添加一個web resource&#xf…

判斷字符是否在1-15之間

var str $(#name).val();//獲取字符的value var reg /^\S{1,15}$/; //字符在1-15之間的正則 var flag reg.test(str); // 判斷字符與正則是否匹配 if(!flag){ //提示不滿足條件 }轉載于:https://www.cnblogs.com/yxl-java/p/8617661.html

從 .NET 6 更新到 .NET 7

Upgrade from .NET 6 to .NET 7Intro.NET 7 已經發布了一段時間了&#xff0c;將幾個服務升級到了 .NET 7&#xff0c;升級還是比較順利的&#xff0c;也有遇到幾個問題&#xff0c;分享一下TargetFramework首先我們需要將項目文件中的目標框架&#xff08;TargetFramework&…

MySQL-05:pymysql與pycharm設置

PyMySQL介紹 PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個庫&#xff0c;Python2中則使用mysqldb。 Django中也可以使用PyMySQL連接MySQL數據庫。 PyMySQL安裝 pip install pymysql 連接數據庫 前置條件&#xff1a; 已有一個MySQL數據庫&#xff0c;并且…

如何將前端數據保存到文件

有時候&#xff0c;網頁上需要提供將當前頁面上的數據導出為本地文件的功能&#xff0c;例如將頁面上的一個表格導出為csv文件。這個功能看似簡單&#xff0c;實際上卻沒有什么直接的方法。由于導出文件的操作&#xff08;比如瀏覽文件目錄&#xff0c;創建本地文件等&#xff…

hdmi-cec_如何使用HDMI-CEC使用PlayStation 4或Pro自動打開電視

hdmi-cecCall it petty, but there’s just something about eliminating the “turn on the TV” portion of firing up your PlayStation 4 that makes the whole process seem faster. And the good news is that getting this action on your setup is as easy and ticking…

Microsoft POS for .NET v1.12 發布了

Microsoft POS for .NET v1.12是一個類庫&#xff0c;它為你的.NET應用程序與POS設備的交互提供了一組簡單統一的接口。使得供應商能夠為常見的POS設備(如收銀機&#xff0c;掃描儀等)輕松開發出通用的應用程序&#xff0c;您可以在此處下載.POSv1.12的更新&#xff1a;與 UPOS…

【APP接口開發】常用HTTP響應頭狀態碼詳解

1、200 OK&#xff0c;客戶端請求城成功 2、400 Bad Request &#xff0c;客服端請求語法錯誤&#xff0c;服務器無法理解和處理 3、401 unauthorized&#xff0c;請求未通過認證 4、403 permission forbidden &#xff0c;無權限 5、404 URI不存在&#xff0c;訪問的資源不存在…

leetcode——Lowest Common Ancestor of a Binary Tree

題目 Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. 思路 這一次說的是一個普通的二叉樹&#xff0c;給出兩個節點。求他們的最低公共父節點。回憶一下&#xff0c;當這棵二叉樹是二分查找樹的時候的解決方式&#xff1a; 二分…

MySQL-06:pyMySQL增刪改查基本命令筆記

增 # 導入pymysql模塊 import pymysql # 連接database conn pymysql.connect(host“你的數據庫地址”, user“用戶名”,password“密碼”,database“數據庫名”,charset“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor conn.cursor() sql "INSERT INTO USER1(n…

ABP Framework 7.0 RC 新增功能簡介

imageABP Framework 在架構上有四大目標&#xff1a;模塊化、DDD、多租戶和微服務。從 7.0 更新的功能來看&#xff0c;其側重點轉向微服務場景的實現&#xff0c;比如&#xff1a;Dapr 集成、動態權限和功能、外部本地化、分布式實體緩存服務&#xff0c;都是對微服務和分布式…

(原創) 07/28/1982 少女A (中森明菜)

Abstract明菜的第二首單曲&#xff0c;也是她的成名曲&#xff0c;在臺灣曾經被歌手嘟嘟翻唱過。 Introduction[hjp2400,300,true]http://oomusou.googlepages.com/shojo_a.flv[/hjp2] 明菜從『少女A』這首單曲才開始竄紅&#xff0c;走的也是可愛路線&#xff0c;招牌的『明菜…

ftp服務

1.ftp工作原理FTP是一個客戶機/服務系統。用戶通過一個支持FTP協議的客戶機程序&#xff0c;連接到在遠程主機上的FTP服務器程序。用戶通過客戶機程序向服務器程序發出命令&#xff0c;服務器程序執行用戶所發出的命令&#xff0c;并將執行的結果返回到客戶機。2.安裝ftp服務yu…

Spark Streaming高級特性在NDCG計算實踐

從storm到spark streaming&#xff0c;再到flink&#xff0c;流式計算得到長足發展&#xff0c; 依托于spark平臺的spark streaming走出了一條自己的路&#xff0c;其借鑒了spark批處理架構&#xff0c;通過批處理方式實現了實時處理框架。為進一步了解spark streaming的相關內…

mac觸控板 鼠標中鍵_如何在Windows 10中停止意外的觸控板點擊(以及其他鼠標增強功能)...

mac觸控板 鼠標中鍵It’s been the bane of laptop users for years: you’re typing away, your palm brushes the trackpad, and the accidental click inserts the cursor in the middle of the text completely screwing things up. Banish the frustration of accidental …

.Net 7的AOT原理簡析

楔子上節了解AOT和CLR的區別&#xff0c;這節來稍微深入看下AOT的原理是什么&#xff1f;原理其實 AOT 的原理非常簡單&#xff0c;為啥呢&#xff1f;因為微軟又回歸了傳統&#xff0c;搞起來Obj目標文件和Link連接器。當年的VC就是這么弄的。AOT的編譯實際上是圍繞這兩個東西…

垂直居中及容器內圖片垂直居中的CSS解決方法

方法一: <style type"text/css"> <!-- * {margin:0;padding:0} div { width:500px; height:500px; border:1px solid #666; overflow:hidden; position:relative; display:table-cell; text-align:center; vertical-align:middle } div p …

Django04: ORM配置與使用MySQL數據庫

配置&#xff1a; 1.手動創建數據庫。 create database testDB 2. 在Django項目的settings.py文件中&#xff0c;配置數據庫連接信息&#xff1a; DATABASES {"default": {"ENGINE": "django.db.backends.mysql","NAME": "你…

推薦一款 .NET 編寫的 嵌入式平臺的開源仿真器

Renode 是一個開發框架&#xff0c;通過讓你模擬物理硬件系統來加速物聯網和嵌入式系統開發。Renode 可以模擬 Cortex-M、RISC-V 等微控制器&#xff0c;不僅可以模擬 CPU指令&#xff0c;還可以模擬外設&#xff0c;甚至可以模擬板載的外設。更強的是&#xff0c;它可以讓你在…