Blazor中,路由系统负责根据浏览器请求的URL将请求映射到对应的组件上,这篇笔记我们学习Blazor中路由系统的使用。
Blazor框架内置了路由组件<Router>
,我们通常将其定义在根组件App.razor
或者拆分到一个Routes.razor
中,路由组件负责拦截传入的请求并呈现与请求URL相匹配的页面,下面是一个例子。
Components/Routes.razor
<Router AppAssembly="typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
<FocusOnNavigate RouteData="routeData" Selector="h1" />
</Found>
</Router>
Components/App.razor
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/" />
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
<link rel="stylesheet" href="app.css" />
<link rel="stylesheet" href="Gacfox.DemoBlazorServer.styles.css" />
<link rel="icon" type="image/png" href="favicon.png" />
<HeadOutlet />
</head>
<body>
<Routes />
<script src="_framework/blazor.web.js"></script>
</body>
</html>
路由组件中,我们创建了<Router>
元素,其中AppAssembly="typeof(Program).Assembly"
指示Blazor路由系统使用当前程序集来查找页面组件。<Found>
表示如果有匹配的路由则会执行其中的内容,Context="routeData"
会把匹配到的路由信息(如路由参数等)存储到routeData
变量中供后续使用。<RouteView>
用来渲染当前路由匹配的页面组件,RouteData="routeData"
将之前存储的路由数据传递给它,DefaultLayout="typeof(Layout.MainLayout)"
配置了默认的布局为MainLayout
。
在任意Blazor组件中,如果使用@page
指令定义了路由,当浏览器访问对应URL时,该组件就会被渲染出来。
@page "/"
<h1>Hello, world!</h1>
定义的路由可以带有参数,Blazor组件中我们可以解析这些参数,下面是一个例子。
@page "/Student/{Id:long}"
<h3>Student: @Id</h3>
@code {
[Parameter]
public long Id { get; set; }
}
代码中,Id
是一个long
类型的参数,{Id:long}
也同时约束了参数的类型,如果类型不符合则路由不会匹配。如果不使用类型约束,默认使用字符串类型接收参数。
Blazor中,我们可以使用<NavLink>
组件实现链接跳转,下面是一个例子。
@page "/"
<NavLink href="/weather">天气功能</NavLink>
<NavLink>
组件的href
属性指定了跳转的地址,该组件最终会被渲染为HTML的<a>
标签。
除了使用<NavLink>
组件,我们也可以手动使用代码进行路由跳转。
@page "/"
@rendermode InteractiveServer
@inject NavigationManager Navigation
<button @onclick="HandleButtonClick">天气功能</button>
@code {
private void HandleButtonClick()
{
Navigation.NavigateTo("/weather");
}
}
由于用到了C#代码,我们的页面组件需要被定义为交互式的,因此指定了@rendermode InteractiveServer
,这里我们还注入了一个NavigationManager
的实例,这里当点击按钮时,我们调用了其NavigateTo()
方法实现了页面跳转。