學習.NET MAUI Blazor(四)、路由

来源:https://www.cnblogs.com/gmval/archive/2023/01/05/17027356.html
-Advertisement-
Play Games

在ERP系統中,採集一線的生產數據是重要工作之一,而稱重計量是企業的核心資產數據,人工計重費時費力,還容易出錯,重量數據是否正確,直接影響企業的採購或銷售額。基於此,由系統對接電子秤實現自動抓取數據是企業管理的第一步。 電子秤,一般由重量感測器、砝碼、底座、儀錶等組成。儀錶與感測器相連,儀錶一般具有 ...


Web應用程式的可以通過URL將多個頁面串聯起來,並且可以互相跳轉。Web應用主要是使用a標簽或者是服務端redirect來跳轉。而現在流行的單頁應用程式 (SPA) ,則通過路由(Router)來實現跳轉,如Vue 、React等。

提示
MAUI的路由與Blazor路由有很大區別。

目錄

MAUI Blazor的路由

在.NET MAUI Blazor應用中,路由是遵循Blazor的路由規則。也是通過路由組件(Router)實現的,打開Main.razor可以看到:

<Router AppAssembly="@typeof(Main).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
        <FocusOnNavigate RouteData="@routeData" Selector="h1" />
    </Found>
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <p role="alert">Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>
<!--設置容器-->
<AntContainer />

Router 有兩個子節點FoundNotFound

  • Found節點包含一個RouteView的定義,如果找到了路由定義就通過RouteView來呈現對應的頁面,同時為所有頁面指定預設的模板。
  • NotFound節點包含一個LayoutView的定義,如果沒找到路由定義則呈現一個特定的頁面,這裡使用的預設模板是MainLayout,也可以自己實現一個。

定義MAUI Blazor路由

在MAUI Blazor中,路由的定義使用@page指令進行指定。在創建Blazor組件的時候,必須包含@page '路徑"

MAUI路由與MAUI Blazor路由有很大區別
MAUI創建路由是根據Route屬性或者通過 Routing.RegisterRoute顯式的註冊路由。
MAUI Blazor 則是在組件上,使用@page指令指定。

Visual Studio 2022編譯器在編譯帶有 @page 指令的 Razor 組件 (.razor) 時,將為組件類提供一個 RouteAttribute 來指定組件的路由。

當應用程式啟動時,應用程式將掃描由Router組件中AppAssembly屬性指定的程式集,收集程式集中具有 RouteAttribute 的Blazor組件的路由信息。

在應用程式運行時,RouteView 組件:

  • 從 Router 接收 RouteData 以及所有路由參數。
  • 使用指定的組件的佈局來呈現該組件,包括任何後續嵌套佈局。

提示
Router 不與查詢字元串值交互。

匹配到路由時

我們在上次代碼的基礎上,增加一個頁面。在Pages目錄下,新建一個Blazor組件:pdf.razor。創建完成後,預設代碼是這樣的:

<h3>pdf</h3>

@code {

}

我們使用@page指令指定路由為pdf。並寫上幾個大字。

@page "/PDF"

<Title Level="1">使用iTextSharp生成PDF文件</Title>

然後打開MainLayout.razor,給菜單增加一個MenuDataItem

new MenuDataItem
{
	Path = "/PDF",
	Name = "PDF",
	Key = "PDF",
	Icon = "file-pdf"
}

註意:
Blazor組件必須是大寫字母開頭,如果使用小寫字母開頭,編譯的時候,會報一個錯:
Component 'xxx' starts with a lowercase character. Component names cannot start with a lowercase character
xxx是組件的名字。

看下運行的效果:
在這裡插入圖片描述

未匹配到路由時

如果未匹配到路由,則會呈現上面的NotFound節點定義的內容。先把NotFound節點的內容稍微改造一下!

<NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <div style="text-align:center"><Icon Type="close-circle" Theme="twotone" TwotoneColor="#ff0000" Height="5em" Width="5em" /></div>
            <div style="margin-top:15px;text-align:center"><Title Level="3">頁面走失!請確認輸入的URL是否正確!</Title></div>
        </LayoutView>
    </NotFound>

MainLayout.razor中,增加一個MenuDataItem,指向一個不存在的頁面:

new MenuDataItem
{
	Path = "/DataList",
	Name = "DataList",
	Key = "DataList",
	Icon = "appstore"
}

看下運行效果:
在這裡插入圖片描述

路由跳轉

很多場景中,除了點擊左側的菜單跳轉外,在頁面中也需要進行跳轉,Blazor支持的跳轉除了HTML標記<a></a>外,還有個NavigationManager類。
NavigationManager類在Microsoft.AspNetCore.Components命名空間下。
改造下Index.razor

@page "/"
@inject NavigationManager navigationManager
<Title Level="1">Hello,DotNet寶藏庫</Title>
<div style="margin-top:15px;"><Text Type="success">歡迎關註我的公眾號!</Text></div>
<Divider />
<div style="margin-top:20px;"><a href="/Counter">使用a 標記跳轉</a></div>
<div style="margin-top:20px;">
    <Button Danger Type="@ButtonType.Primary" OnClick="()=>DirectToCounter()">使用NavigationManager跳轉</Button>
</div>
@code
{
    private void DirectToCounter()
    {
        navigationManager.NavigateTo("/Counter");
    }
}

這時,不論是點擊鏈接還是點擊按鈕,都可以跳轉到響應頁面!
在這裡插入圖片描述

路由參數

路由的過程當中經常需要進行參數傳遞,以方便我們跳轉到的新頁面後進行一些操作。
Blazor傳參分為兩種情況:path傳參以及QueryString傳參。我們分別介紹下這兩種傳參的方法。

path傳參

path傳參就是把參數組合在URL路徑里,接收參數的頁面需要在@page以相同的名稱填充參數。並添加Parameter特性對參數進行修飾。
先改造下Counter.razor

@page "/counter"
@page "/counter/{initNum}"

<Title Level="2">Counter</Title>
<Divider />
<p role="status">Current count: @currentCount</p>

<Button @onclick="IncrementCount" Type="primary">AntDesign 按鈕</Button>
@code {
    [Parameter]
    public string initNum{ get; set; }

    private int currentCount = 0;
    
    protected override void OnParametersSet()
    {
        if (!int.TryParse(initNum, out int num))
        {
            currentCount = 0;
        }else
        {
            currentCount = num;
        }
    }
    private void IncrementCount()
    {
        currentCount++;
    }
    
}


代碼中,增加了一個@page "/counter/{initNum}"{initNum}就是參數。

註意參數是不區分大小寫的,但是為了更規範,建議URL全部用小寫,c#代碼則使用駝峰式命名。
還有Blazor並不支持可選參數,所以如果這個例子裡面的initNum是可有可無的,則需要使用@page指令來定義兩條路由,一條包含initNum,另一條不包含。
OnParametersSetOnParametersSetAsync中,我們把initNum賦值給currentCount
修改下Index.razor中的DirectToCounter方法:

 private void DirectToCounter()
    {
        navigationManager.NavigateTo("/Counter/10");
    }

運行起來,當點擊使用NavigationManager跳轉按鈕後,Counter.razor中的currentCount為10。
在這裡插入圖片描述

QueryString 傳參

除了把參數直接拼接在URL路徑(path)里,另一種常用的傳遞參數的方法是,將參數做為QueryString傳遞給跳轉頁面,比如“/Counter?initNum=3”。我們可從 NavigationManager.Uri 屬性中獲取請求的查詢字元串。
Index.razor里的
<a href="/Counter">使用a 標記跳轉</a>改為<a href="/Counter?initNum=5">使用a 標記跳轉</a>

修改Counter.razor,先引入NavigationManager

@page "/counter"
@inject NavigationManager navigationManager

OnParametersSet內獲取參數

	protected override void OnParametersSet()
    {
        //if (!int.TryParse(initNum, out int num))
        //{
        //    currentCount = 0;
        //}else
        //{
        //    currentCount = num;
        //}
        var query = new Uri(navigationManager.Uri).Query;
        Console.WriteLine(query);
    }

斷點後,可以看到,從Index.razor點擊鏈接跳轉到Counter.razor後,獲取到了參數:
在這裡插入圖片描述
這裡有個問題,獲取到的參數不是鍵值對,而是一串字元串。與我們的期望不同。不過還好,我們可以通過QueryHelpers.ParseQuery來獲取到鍵值對信息。
1、添加依賴:

PM> NuGet\Install-Package Microsoft.AspNetCore.WebUtilities -Version 2.2.0

2、解析參數

var queryDic = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);

在這裡插入圖片描述
可以獲取到參數值了。把代碼補充完整:

protected override void OnParametersSet()
    {
        //if (!int.TryParse(initNum, out int num))
        //{
        //    currentCount = 0;
        //}else
        //{
        //    currentCount = num;
        //}
        var query = new Uri(navigationManager.Uri).Query;
        var queryDic = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);
        if (queryDic.ContainsKey("initNum"))
        {
            var count_str = queryDic["initNum"].ToString() ?? "";
            if (!int.TryParse(count_str, out int num))
            {
                currentCount = 0;
            }
            else
            {
                currentCount = num;
            }
        }
        else
        {
            currentCount = 0;
        }
        
    }

運行一下看看效果

在這裡插入圖片描述

路由約束

路由約束強制在路由段和組件之間進行類型匹配。像剛纔例子中的initNum,我們可以寫成@page "/counter/{initNum:int}",路由約束不適用於查詢字元串,也就是QueryString傳遞的參數。Blazor支持以下幾種約束類型:

  • bool
  • datetime
  • decimal
  • double
  • float
  • guid
  • int
  • long

總結

暫無,下次再會!

歡迎大家關註我的微信公眾號,一起進步,一起成長
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引言 spring實現的bean自動註入在項目開發中是一個經常使用到的功能,但自動裝配兩個或多個bean時,會拋出NoUniqueBeanDefinitionException:No qualifying bean of type 'com' available: expected single m ...
  • RESTfulL是一種網路應用程式的設計風格和開發方式,即介面請求方式和路徑的一種風格。 普通風格: localhost:8080/add?a=1&b=2 RestFul風格: localhost:8080/add/1/2 GET 獲取: localhost:8080/item/1 POST 新增: ...
  • 1、粘包與半包 啥也不說了,直接上代碼是不是有點不太友好,我所謂了,都快過年了,還要啥自行車 我上來就是一段代碼猛如虎 1.1 伺服器代碼 public class StudyServer { static final Logger log = LoggerFactory.getLogger(Stu ...
  • 我的客服系統有一些介面是專門給內部調用的,只允許其他內部系統來調用,不允許隨意訪問,可以使用IP白名單機制 使用 Gin 框架實現 IP 白名單機制可以使用中間件的方式實現。你可以編寫一個中間件函數,在每個請求到來時檢查它的 IP 地址是否在白名單中,如果不在,則返回錯誤信息。 例如,你可以這樣編寫 ...
  • JetBrains Clion 是一款專為 C/C++ 開發所設計的跨平臺 IDE。本文適用 JetBrains CLion v2019.3/3.1/3.2/3.3 永久激活,附破解補丁和激活碼,可以永久激活 Windows、MAC、Linux 下的 CLion!!!網上有激活碼的激活方式(更改 h ...
  • go build 命令好處 我開發了一套線上客服系統源碼,使用了go build進行編譯 在我的線上客服系統使用 go build 命令的主要好處是,它可以將 Go 程式編譯成可執行文件,這樣就可以將程式部署到生產環境中。 在生產環境中運行的程式通常是編譯後的可執行文件,因為這樣可以提高程式的執行效 ...
  • 可迭代對象通過iter(),轉化為迭代器對象,迭代器可以使用next()訪問,可迭代對象不能直接使用next(); 迭代器是一個可以記住遍歷的位置的對象,所以可以方便的使用next()。 可迭代對象(iterable):凡是具有__iter__的方法的類,都是可迭代的類。可迭代類創建的對象實現了__ ...
  • ​ 最近的資料庫課程要求將MySQL資料庫部署在伺服器上,參考了大佬們的博客後,總結一下。 先放上參考的大佬們的博客。 【原創經驗分享】JQuery(Ajax)調用WCF服務 - 南宮蕭塵 - 博客園 (cnblogs.com) WinForm+WCF+mysql+http實現簡單的用戶登錄註冊_小 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...