Blazor University (26)路由 —— 通過代碼導航

原文鏈接:https://blazor-university.com/routing/navigating-our-app-via-code/

通過代碼導航

源代碼[1]

從 Blazor 訪問瀏覽器導航是通過 NavigationManager 服務提供的。這可以使用 razor 文件中的 @inject 或 CS 文件中的 [Inject] 屬性注入到 Blazor 組件中。

NavigationManager 服務有兩個特別的成員;NavigateToLocationChanged

LocationChanged 事件將在檢測導航事件[2]中更詳細地解釋。

NavigateTo 方法

NavigationManager.NavigateTo 方法使 C# 代碼能夠控制瀏覽器的 URL。與截獲的導航一樣,瀏覽器實際上并不導航到新的 URL。相反,瀏覽器中的 URL 被替換,之前的 URL 被插入到瀏覽器的導航歷史中,但沒有向服務器請求新頁面的內容。通過 NavigateTo 進行的導航將觸發 LocationChanged 事件,傳遞新 URL 并為 IsNavigationIntercepted 傳遞 false

對于此示例,我們將再次更改標準 Blazor 模板。我們將使用我們之前在路由參數[3]和可選路由參數[4]中學到的知識。

首先,刪除 Index.razorFetchData.razor 頁面,并刪除 NavMenu.razor 文件中指向這些頁面的鏈接。同樣在 NavMenu 中,將 counter 鏈接的 href 更改為 為 href="",因為我們將使其成為默認頁面。

編輯 Counter.razor 并給它兩個路由,“/” 和 “/counter/{CurrentCount:int}”,同時確保它來自 CounterBase 類,這樣我們就可以在瀏覽器的控制臺窗口中看到導航日志 - CounterBase.cs 文件之前在 OnLocationChanged 部分中進行了概述。

@page?"/"
@page?"/counter/{CurrentCount:int}"
@inherits?CounterBase

我們還需要更改 currentCount 字段,使其成為具有 gettersetter 的屬性,并將其裝飾為 [Parameter]。請注意,它也已從 camelCase 重命名為 PascalCase

[Parameter]
public?int?CurrentCount?{?get;?set;?}

我們現在有一個 counter 頁面,可以簡單地訪問應用程序的主頁,也可以通過指定 /counter/X 來訪問,其中 X 是一個整數值。

NavigationManager 被注入到我們的 CounterBase 類中,因此可以在 Counter.razor 文件中訪問。

@code?{[Parameter]public?int?CurrentCount?{?get;?set;?}bool?forceLoad;void?AlterBy(int?adjustment){int?newCount?=?CurrentCount?+?adjustment;UriHelper.NavigateTo("/counter/"?+?newCount,?forceLoad);}
}

我們將從兩個按鈕調用 AlterBy 方法,一個用于增加 CurrentCount,一個用于減少它。還有一個用戶可以選擇的選項 forceLoad,它將在調用 NavigateTo 時設置相關參數,以便我們看到差異。整個文件最終應如下所示:

@page?"/"
@page?"/counter/{CurrentCount:int}"
@implements?IDisposable
@inject?NavigationManager?NavigationManager<h1>Counter?value?=?@CurrentCount</h1><div?class="form-check"><input?@bind=@forceLoad?type="checkbox"?class="form-check-input"?id="ForceLoadCheckbox"?/><label?class="form-check-label"?for="ForceLoadCheckbox">Force?page?reload?on?navigate</label>
</div><div?class="btn-group"?role="group"><button?@onclick=@(?()?=>?AlterBy(-1)?)?class="btn?btn-primary">-</button><input?value=@CurrentCount?readonly?class="form-control"?/><button?@onclick=@(?()?=>?AlterBy(1)?)?class="btn?btn-primary">+</button>
</div>
<a?class="btn?btn-secondary"?href="/Counter/0">Reset</a>
<p><em>Page?redirects?to?ibm.com?when?count?hits?10!</em>
</p>@code?{[Parameter]public?int?CurrentCount?{?get;?set;?}bool?forceLoad;void?AlterBy(int?adjustment){int?newCount?=?CurrentCount?+?adjustment;if?(newCount?>=?10)NavigationManager.NavigateTo("https://ibm.com");NavigationManager.NavigateTo("/counter/"?+?newCount,?forceLoad);}protected?override?void?OnInitialized(){//?Subscribe?to?the?eventNavigationManager.LocationChanged?+=?LocationChanged;base.OnInitialized();}private?void?LocationChanged(object?sender,?LocationChangedEventArgs?e){string?navigationMethod?=?e.IsNavigationIntercepted???"HTML"?:?"code";System.Diagnostics.Debug.WriteLine($"Notified?of?navigation?via?{navigationMethod}?to?{e.Location}");}void?IDisposable.Dispose(){//?Unsubscribe?from?the?event?when?our?component?is?disposedNavigationManager.LocationChanged?-=?LocationChanged;}
}

單擊 -+ 按鈕將調用 AlterBy 方法,該方法將指示 NavigationManager 服務導航到 /counter/X,其中 X 是調整后的 CurrentCount 的值——在瀏覽器的控制臺中產生以下輸出:

WASM:通過代碼通知導航到 http://localhost:6812/counter/1
WASM:通過代碼通知導航到 http://localhost:6812/counter/2
WASM:通過代碼通知導航到 http://localhost:6812/counter/3
WASM:通過代碼通知導航到 http://localhost:6812/counter/4

單擊重置鏈接將導航到 /counter/0,重置 CurrentCount 的值。

WASM:通過代碼通知導航到 http://localhost:6812/counter/1
WASM:通過代碼通知導航到 http://localhost:6812/counter/2
WASM:通過代碼通知導航到 http://localhost:6812/counter/3
WASM:通過代碼通知導航到 http://localhost:6812/counter/4
WASM:通過 HTML 通知導航到 http://localhost:6812/Counter/0

ForceLoad

forceLoad 參數指示 Blazor 繞過其自己的路由系統,而是讓瀏覽器實際導航到新 URL。這將導致對服務器的 HTTP 請求以檢索要顯示的內容。

請注意,導航到站外 URL 不需要強制加載。調用 NavigateTo 到另一個域將調用完整的瀏覽器導航。

使用本節的 GitHub 示例。在瀏覽器的控制臺窗口中查看 IsNavigationIntercepted 在通過按鈕和重置鏈接導航時有何不同,并在瀏覽器的網絡窗口中查看根據您是否:

  • 將 forceLoad 設置為 false 進行導航。

  • 將 forceLoad 設置為 true 進行導航。

  • 導航到站外 URL。

要觀察最后一種情況,您可能希望更新 AdjustBy 方法以在 CurrentValue 傳遞特定值時進行站外導航。

void?AlterBy(int?adjustment)
{int?newCount?=?CurrentCount?+?adjustment;if?(newCount?>=?10)NavigationManager.NavigateTo("https://ibm.com");NavigationManager.NavigateTo("/counter/"?+?newCount,?forceLoad);
}

參考資料

[1]

源代碼: https://github.com/mrpmorris/blazor-university/tree/master/src/Routing/NavigatingViaCode

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

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

相關文章

Android之使用自定義華為掃描SDK掃描二維碼和識別本地圖片

1、需求 更具UI的設計實現掃描二維碼和識別本地圖片二維碼功能。 zxing掃描二維碼還可以,但是識別本地圖片二維碼功能效果太差,非常不理想,看了看多github很多zxing擴展的開源項目,識別本地圖片二維碼功能效果不樂觀,有些甚至還有裁剪本地圖片,還是不能識別,果斷放棄zb…

Matlab R2016b簡體中文版安裝教程(附Matlab R2016b百度網盤下載地址)

下載的Matlab R2016b軟件安裝包(文末附有下載地址)目錄如下所示: 安裝過程: 1. 安裝主程序R2016b_win64_dvd1.iso和R2016b_win64_dvd2.iso 由于目前大多數及其都是Win8或10系統,所以選中R2016b_win64_dvd1.iso,右鍵→Windows資源管理器打開。Win7系統可以安裝好壓軟件之后…

深度學習String、StringBuffer、StringBuilder

相信String這個類是Java中使用得最頻繁的類之一&#xff0c;并且又是各大公司面試喜歡問到的地方&#xff0c;今天就來和大家一起學習一下String、StringBuilder和StringBuffer這幾個類&#xff0c;分析它們的異同點以及了解各個類適用的場景。下面是本文的目錄大綱&#xff1a…

Leetcode之打印鏈接的倒數第K個節點

1 問題 打印鏈表倒數第K個節點值。 2 代碼實現 #include<stdio.h>//定義一個Node結構體,里面包含了value值和保存了下一個Node的指針(地址) typedef struct Node {int value;Node *next; } Node;//打印鏈表所有的值,循環遍歷一次,因為鏈表節點的最后一個節點肯定是…

MySQL5.5多實例編譯安裝——mysqld_multi

一、MySQL多實例簡介 MySQL多實例&#xff0c;簡單地說&#xff0c;就是在一臺服務器上同時開啟多個不同的服務端口&#xff08;如&#xff1a;3306、3307&#xff09;&#xff0c;同時運行多個MySQL服務進程&#xff0c;這些服務進程通過不同的socket監聽來自不同的端口來提供…

【前端就業課 第一階段】HTML5 零基礎到實戰(二)超鏈接

注意&#xff1a;手機&#xff08;APP&#xff09;打開&#xff0c;內容顯示更佳&#xff0c;不會的私聊博主即可 想要拿代碼或加入學習計劃&#xff08;** 博主會監督你并且教你寫文章 **&#xff09;的拉到最下面&#xff08;PC端Web打開&#xff09;加博主即可&#xff0c;目…

架構,框架,模式,模塊、組件、插件的含義和區別

架構、框架、模式、模塊、組件、插件、控件、中間件的含義和區別。經常看到這些概念&#xff0c;但是有些含糊&#xff0c;花點兒功夫整理一下&#xff0c;結果還是有些地方理解的不透徹&#xff0c;先將整理的內容寫下來&#xff0c;以供交流。左側英文欄中有些單詞被分成了兩…

C語言,C#語言求100-999內的水仙花數源程序

水仙花數&#xff08;Narcissistic number&#xff09;也被稱為超完全數字不變數&#xff08;pluperfect digital invariant, PPDI&#xff09;、自戀數、自冪數、阿姆斯壯數或阿姆斯特朗數&#xff08;Armstrong number&#xff09;&#xff0c;水仙花數是指一個 3 位數&#…

一個精簡的C#表達式執行框架Dynamic Expresso

一、簡介Dynamic Expresso是一個用.NET Standard 2.0編寫的簡單c#語句的解釋器。Dynamic Expresso嵌入了自己的解析邏輯&#xff0c;通過將其轉換為.NET lambda表達式或委托來解釋c#語句。使用Dynamic Expresso開發人員可以創建可編寫腳本的應用程序&#xff0c;無需編譯即可執…

算法馬拉松13 A-E解題報告

A題意&#xff08;取余最長路&#xff09;: 佳佳有一個n*m的帶權矩陣&#xff0c;她想從(1,1)出發走到(n,m)且只能往右往下移動&#xff0c;她能得到的娛樂值為所經過的位置的權的總和。 有一天&#xff0c;她被下了惡毒的詛咒&#xff0c;這個詛咒的作用是將她的娛樂值變為對p…

Modis數據處理工具:MRT百度網盤下載和手把手圖文安裝教程

如下圖所示為 MODIS Reprojection Tool(MRT)的軟界面,看似簡單,卻是Modis遙感影像必不可少的處理工具,如投影變換等。本文以圖文并茂的形式,詳細講解MRT軟件在Windows10平臺上的安裝過程,并附MRT軟件百度網盤下載地址。 Modis Tool主界面: 一、安裝過程 1、安裝Jav…

Word中如何設置圖片與段落的間距為半行

第一種&#xff1a; 正文為5號&#xff0c;那么圖片或者Viso對象前后空一行&#xff0c;設置字號為7號或者更小&#xff0c;這樣設置的間距就是那個7號字的間距&#xff0c;比5號小&#xff0c;看著空白不是那么大。 第二種&#xff1a; Visio對象轉為jpg&#xff0c;然后選中圖…

在微信小程序中使用“隨機鍵盤”

最近研究微信小程序&#xff0c;發現在手機上使用系統鍵盤非常不方便&#xff0c;一是按鍵太小&#xff0c;對于小學生來說&#xff0c;操作非常不方便&#xff1b;二是系統鍵盤反復切換影響界面布局。于是自己決定自己寫一個隨機的小鍵盤。 原理非常簡單&#xff1a;拿“口算練…

Android之提示訂閱配置訂閱需要傳新的包 添加結算權限。

1 問題 apk上google應用市場&#xff0c;然后開通支付商品&#xff0c;錯誤提示如下 2 解決辦法 AndroidManifest.xml里面添加谷歌支付權限 <!-- google pay --><uses-permission android:name"com.android.vending.BILLING" />

【前端就業課 第一階段】HTML5 零基礎到實戰(三)一篇文CSS基礎入門

注意&#xff1a;手機&#xff08;APP&#xff09;打開&#xff0c;內容顯示更佳&#xff0c;不會的私聊博主即可 想要拿代碼或加入學習計劃&#xff08;** 博主會監督你并且教你寫文章 **&#xff09;的拉到最下面&#xff08;PC端Web打開&#xff09;加博主即可&#xff0c;目…

C#如何獲取實體類屬性名和值?

數據模型定義public class User{public User(){student new student();}public string name { get; set; }public string gender { get; set; }public int age { get; set; }public student student { get; set; }}public class student{public int ID { get; set; }public st…

將VNC 安裝在Centos 7步驟

&#xff08; Virtual Network Computing&#xff09;VNC允許Linux系統可以類似實現像Windows中的遠程桌面訪問那樣訪問Linux桌面。本文配置機器是興寧市網絡信息中心的一臺Centos 7 HP服務器環境下運行。 首先試試服務器裝了VNC沒 [rootwic ~]# rpm -q tigervnc tigervnc-serv…

利用MRT進行Modis NDVI數據(MOD13Q1)投影變換格式轉換操作圖文教程

本實例以Modis NDVI(MOD13Q1,空間分辨率為250m)一景影像數據為例,演示利用MRT進行Modis NDVI影像變換,主要內容包括:將.hdf格式轉為.tif格式,將坐標系轉為Albers等積投影。 ArcGIS完美轉換方法: 《ArcGIS10.8完美實現MODIS NDVI數據格式轉換和投影變換》 《重磅!ArcGI…

ActiveMQ無法啟動

解決辦法&#xff1a;activemq無法啟動&#xff0c;端口被占用 用netstat -an無法查出61616被哪個進程占用&#xff08;實踐證明&#xff0c;netstat -ano|findstr 61616什么也沒有找到&#xff09; 經過排查和網上資料參考&#xff0c;被windows的Internet connection share(I…

Android之升級OkHttp編譯提示錯誤如下Using ‘body(): ResponseBody?’ is an error. moved to val

1 問題 升級okHttp庫&#xff0c;編譯項目錯誤如下 Using ‘body(): ResponseBody?’ is an error. moved to val 2 解決辦法 原來的代碼 val list response.body().string() 去掉&#xff08;&#xff09;就可以了 val list response.body.string()