Blazor学习之旅(6)路由系统
大家好,我是Edison。
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应用程序》

Blazor学习之旅(6)路由系统的更多相关文章
- 迷你MVVM框架 avalonjs 学习教程20、路由系统
SPA的成功离开不这三个东西,分层架构,路由系统,储存系统.分层架构是我们组织复杂代码的关键,这里特指MVVM的avalon:路由系统是将多个页面压缩在一个页面的关键:储存系统特指本地储存,是安全保存 ...
- 6月19日 python学习总结 Django之路由系统
Django之路由系统 Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...
- Django基础学习三_路由系统
今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为静态路由.动态路由.二级路由 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配 ...
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...
- ASP.NET MVC4学习笔记路由系统实现
一.路由实现 路由系统实际是一个实现了ASP.NET IHttpModule接口的模块,通过注册HttpApplication的PostResolveRequestCache 事件对Url路由处理.总 ...
- ASP.NET MVC4学习笔记路由系统概念与应用篇
一.概念 1.路由是计算机网络中的一个技术概念,表示把数据包从一个网段转发至另一网段.ASP.NET中的路由系统作用类似,其作用是把请求Url映射到相应的"资源"上,资源可以是一段 ...
- WebApi学习总结系列第四篇(路由系统)
由于工作的原因,断断续续终于看完了<ASP.NET Web API 2 框架揭秘>第二章关于WebApi的路由系统的知识. 路由系统是请求消息进入Asp.net WebApi的第一道屏障, ...
- Python学习(三十一)—— Django之路由系统
转载自:http://www.cnblogs.com/liwenzhou/p/8271147.html Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLc ...
- Python学习---Django路由系统【all】
Django URL (路由系统) Django URL (路由系统): URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映 ...
- django学习笔记整理(2)django的路由系统
创建一个属于你的django框架.django-admin startproject 框架名 打开你的django框架,你会发现里面还有一个和框架名同名的文件夹,那个文件夹就称为一个app. 创建了d ...
随机推荐
- 【Java】Java UDP 套接字编程乱码问题
零.发现问题 用Java写了个UDP收发程序,发现中文有问题! package socket; import java.io.IOException; import java.net.Datagram ...
- Hyperledger Fabric - 自定义createChannel命令
前提条件 启动上一步的自定义network网络 ./network-myself.sh up 拷贝配置文件 以下文件是配置文件及相关脚本文件: mkdir configtx #创建配置文件目录 cp ...
- DeepseekScanner deepseek+python实现代码审计实战
一.功能概述 DeepseekScanner实现了扫描源代码项目中的所有代码文件发送给deepseek进行安全审计的功能.具体细节包括扫描所有子目录中的代码文件,然后依次将代码文件切片发送到deeps ...
- FastAPI依赖注入:链式调用与多级参数传递
title: FastAPI依赖注入:链式调用与多级参数传递 date: 2025/04/05 18:43:12 updated: 2025/04/05 18:43:12 author: cmdrag ...
- Spring Cloud Bus服务总线
一.Spring Cloud Bus是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理,也就是消息总线可以为微服务做监控,也可以实现应用程序之间相互通信,Sprin ...
- MySQL之profiling性能优化
如果需要优化一条SQL,想了解一条sql的每个阶段的耗时分布,则可以使用profiling来进行分析,能很方便的定位在哪个阶段.什么资源引起的性能问题. 一.开启profiling参数 此参数默认是关 ...
- AutoFac(三)——装配扫描(批量注册之扫描类型)
一.装配扫描 Autofac允许通过常规组装的方式去注册组件(构造方法.实例.lambda表达式等),您可以扫描和注册单个类型,也可以具体的扫描Autofac模块去注册. 1.扫描类型 除了已知的的常 ...
- toRefs 与 toRef 的详解
一.引言在 Vue 3 的响应式系统里,toRefs 和 toRef 是两个实用的工具函数,它们在处理响应式数据时发挥着重要作用.合理运用这两个函数,可以让我们在操作响应式对象和数组时更加灵活,避免一 ...
- pikachu靶场的详细搭建,附pikachu靶场源码下载链接
一.安装好phpstudy 首先搭建pikachu靶场的第一步,先是安装好phpstudy,这是一款集成环境的软件,里面包含了Apache,FTP,MySQL,Nginx.phpstudy的官方网址: ...
- 操作系统:linux -- 虚拟文件系统如何管理文件
本节来瞧下Linux是如何管理文件,也验证下Linux那句口号:一切皆文件 为此,我们需要首先搞清楚什么是 VFS,接着理清为了实现 VFS 所用到的数据结构,然后看看一个文件的打开.读写.关闭的过程 ...