學習.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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...