ASP.NET Core Blazor简介和快速入门三(布局和路由)

大家好,我是码农刚子。本文介绍了Blazor中的布局、路由和条件渲染功能。在布局方面,详细讲解了如何创建和应用布局组件(继承LayoutComponentBase),包括默认布局MainLayout的使用、嵌套布局的实现方式以及如何控制特定页面不应用布局(如登录页)。在路由和导航部分,简要提及了基本配置方法。最后,重点阐述了条件渲染(@if语句)和循环渲染(@foreach等)的语法和实际应用场景,通过学生信息列表等示例展示了数据绑定和动态UI生成的实现方式。这些核心功能共同构成了Blazor组件化开发的基础框架。

一、创建和应用Blazor 布局

网站应用往往有许多公共的视图部分,比如顶部导航nav,底部的footer,管理系统的左边的menu菜单等等。Layout可以轻松实现以上的效果。

Blazor 布局是一个 Razor 组件,它与引用该布局的组件共享标记。 布局可以使用数据绑定、依赖关系注入和组件的其他功能。

1、创建布局(可以理解为母版页)

新建一个razor文件,文件顶部使用@inherits LayoutComponentBase 表示继承自LayoutComponentBase ,说明这是个母版页,使@Body作为占位。

复制代码
@inherits LayoutComponentBase

<PageTitle>Doctor Who® Database</PageTitle>

<header>
    <h1>Doctor Who® Database</h1>
</header>

<nav>
    <a href="main-list">Main Episode List</a>
    <a href="search">Search</a>
    <a href="new">Add Episode</a>
</nav>

@Body

<footer>
    @TrademarkMessage
</footer>

@code {
    public string TrademarkMessage { get; set; } ="CSharp精选营";
}

2、MainLayout 组件

在从 Blazor 项目模板创建的应用中,MainLayout 组件就是应用的默认布局。

Blazor 的 CSS 隔离功能将独立 CSS 样式应用于 MainLayout 组件。 按照惯例,样式由相同名称的随附样式表 MainLayout.razor.css 提供。

3、应用布局

在razor文件顶部申明"@layout 模板页名"来设置母版页,

如果一个页面没有设置模板页,(就像blazor默认项目那样),他就会使用在app.razor文件中定义的默认模板页

如何 不设置任何模板页?

比如我们的登录的页面是不需要加通用模板的,通过@if 控制 RouteView的DefaultLayout即可

复制代码
<Router AppAssembly="@typeof(App).Assembly">
	<Found Context="routeData">
		@if (routeData.PageType == typeof(Pages.LayoutSample))
		{
			<RouteView RouteData="@routeData" />
		}
		else
		{
			<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>

4、嵌套布局

组件可以引用一个布局,该布局又可以引用另一个布局。 例如,嵌套布局可用于创建多级菜单结构。

以下示例演示如何使用嵌套布局:

复制代码
@inherits LayoutComponentBase
@layout ProductionsLayout

<PageTitle>Doctor Who® Database</PageTitle>
<header>
    <h1>Doctor Who® Database</h1>
</header>
<nav>
    <a href="main-episode-list">Main Episode List</a>
    <a href="episode-search">Search</a>
    <a href="new-episode">Add Episode</a>
</nav>

@Body

<footer>
    @TrademarkMessage
</footer>

@code {
    public string TrademarkMessage { get; set; } =
        "CSharp精选营";
}

ProductionsLayout 组件包含顶级布局元素,其中包含有标头 (<header>...</header>) 和页脚 (<footer>...</footer>) 元素。 带有DoctorWhoLayout组件的 Episodes 会在@Body出现的位置显示。

复制代码
@inherits LayoutComponentBase

<header>
    <h1>Productions</h1>
</header>

<nav>
    <a href="main-production-list">Main Production List</a>
    <a href="production-search">Search</a>
    <a href="new-production">Add Production</a>
</nav>

@Body

<footer>
    Footer of Productions Layout
</footer>

以下呈现的 HTML 标记由前面的嵌套布局生成:

复制代码
<header><h1>Productions</h1></header>
<nav><a href="main-production-list">Main Production List</a>
    <a href="production-search">Search</a>
    <a href="new-production">Add Production</a>
</nav>
<header><h1>Doctor Who® Database</h1></header>
<nav><a href="main-episode-list">Main Episode List</a>
    <a href="episode-search">Search</a>
    <a href="new-episode">Add Episode</a>
</nav>
<footer>CSharp精选营</footer>
<footer>
    Footer of Productions Layout
</footer>

更多参考:

https://learn.microsoft.com/zh-cn/aspnet/core/blazor/components/layouts?view=aspnetcore-9.0

二、路由配置和导航

ASP.NET Core Blazor 路由配置和导航https://blog.csdn.net/SC2LQ/article/details/153776798

三、条件渲染和循环渲染

第一章中已经讲过了Blazor的语法。

1、Blazor 条件渲染

Blazor 中的 @if 语法用于根据条件动态渲染页面元素。它类似于 C# 的 if 语句,但专门用于处理 UI 渲染。请看以下示例:

复制代码
@if (isLoading)
{
   <p>加载中...</p>
}
else
{
   <p>加载完成!</p>
}
@code {
   private bool isLoading = true;
   protected override void OnInitialized()
   {
       // 模拟加载完成
       Task.Delay(2000).ContinueWith(_ =>
       {
           isLoading = false;
           InvokeAsync(StateHasChanged);
       });
   }
}

你可以嵌套多个 @if 或结合 else if 使用:

复制代码
@if (userRole == "Admin")
{
   <p>欢迎管理员!</p>
}
else if (userRole == "User")
{
   <p>欢迎普通用户!</p>
}
else
{
   <p>请登录。</p>
}
@code {
   private string userRole = "Admin";
}

2、Blazor 循环渲染

下面我们有一个list需要显示多个学生信息,@for,@do...while,@while 与foreach类似这里就不在赘述

复制代码
<h3>用户列表</h3>

<table>
	<thead>
		<tr>
			<th>Name</th>
			<th>Age</th>
			<th>Gender</th>
		</tr>
	</thead>
	<tbody>

		@foreach (var item in list)
		{
			<tr>
				<td>@item.Name</td>
				<td>@item.Age</td>
				@switch (item.Gender)
				{
					case 0:
						{
							<td>男</td>
							break;
						}
					case 1:
						{
							<td>女</td>
							break;
						}
					case 2:
						{
							<td>未知</td>
							break;
						}

				}
			</tr>
		}
	</tbody>

</table>


@code {
	List<User> list = new List<User>();
	User User1 = new User()
		{
			Name = "John",
			Age = 20,
			Gender = 2,
		};
	User User2 = new User()
		{
			Name = "Sub",
			Age = 22,
			Gender = 0,
		};
	protected override void OnInitialized()
	{
		list.Add(User1);
		list.Add(User2);
	}

	public class User
	{
		public string Name { get; set; } = string.Empty;
		public int Age { get; set; }
		public int Gender { get; set; } // 0: 男, 1: 女, 2: 未知
		
	}
}
相关推荐
命里有定数25 分钟前
保姆级教程:在 Windows (WSL2) 下本地部署 Qwen3-ASR
windows
lucky67074 小时前
Windows 上彻底卸载 Node.js
windows·node.js
编程小白20264 小时前
从 C++ 基础到效率翻倍:Qt 开发环境搭建与Windows 神级快捷键指南
开发语言·c++·windows·qt·学习
凯子坚持 c6 小时前
CANN 性能剖析实战:从原始事件到交互式火焰图
windows·microsoft
开开心心就好6 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
獨枭7 小时前
PyCharm 跑通 SAM 全流程实战
windows
仙剑魔尊重楼7 小时前
音乐制作电子软件FL Studio2025.2.4.5242中文版新功能介绍
windows·音频·录屏·音乐·fl studio
PHP小志8 小时前
Windows 服务器怎么修改密码和用户名?账户被系统锁定如何解锁
windows
专注VB编程开发20年9 小时前
vb.net datatable新增数据时改用数组缓存
java·linux·windows
仙剑魔尊重楼9 小时前
专业音乐制作软件fl Studio 2025.2.4.5242中文版新功能
windows·音乐·fl studio